在 mongoHQ 和 mongoose 上使用 node.js、mongodb。我正在为类别设置架构。我想使用文档 ObjectId 作为我的 categoryId。

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    categoryId  : ObjectId,
    title       : String,
    sortIndex   : String
});

然后我跑
var Category = mongoose.model('Schema_Category');
var category = new Category();
category.title = "Bicycles";
category.sortIndex = "3";

category.save(function(err) {
  if (err) { throw err; }
  console.log('saved');
  mongoose.disconnect();
});

请注意,我没有为 categoryId 提供值。我假设 Mongoose 将使用模式来生成它,但文档具有通常的“_id”而不是“categoryId”。我究竟做错了什么?

最佳答案

与传统的 RBDM 不同,mongoDB 不允许您定义任何随机字段作为主键,所有标准文档都必须存在 _id 字段。

因此,创建单独的 uuid 字段没有意义。

在 mongoose 中,ObjectId 类型不用于创建新的 uuid,而是主要用于引用其他文档。

下面是一个例子:

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Product = new Schema({
    categoryId  : ObjectId, // a product references a category _id with type ObjectId
    title       : String,
    price       : Number
});

如您所见,使用 ObjectId 填充 categoryId 没有多大意义。

但是,如果您确实想要一个命名良好的 uuid 字段,mongoose 提供了允许您代理(引用)字段的虚拟属性。

一探究竟:
var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    title       : String,
    sortIndex   : String
});

Schema_Category.virtual('categoryId').get(function() {
    return this._id;
});

所以现在,每当您调用 category.categoryId 时,mongoose 只会返回 _id。

您还可以创建一个“set”方法,以便您可以设置虚拟属性,请查看 this link
欲了解更多信息

关于node.js - 如何在 mongoose 中将 ObjectId 设置为数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8111846/

10-16 21:02