如何将ObjectId设置为mongoose中的数据types

在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字段。

出于这个原因,创build一个单独的uuid字段是没有意义的。

在mongoose中,ObjectIdtypes用于不创build新的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。

您也可以创build一个“设置”方法,以便您可以设置虚拟属性,查看此链接了解更多信息

我正在为问题标题寻找不同的答案,所以也许其他人也会这样。

要将types设置为ObjectId(例如,您可以引用author作为book的作者),您可以这样做:

 const Book = mongoose.model('Book', { author: { type: mongoose.Schema.Types.ObjectId, // here you set the author ID // from the Author colection, // so you can reference it required: true }, title: { type: String, required: true } }); 

我使用ObjectId的解决scheme

 // usermodel.js const mongoose = require('mongoose') const Schema = mongoose.Schema const ObjectId = Schema.Types.ObjectId let UserSchema = new Schema({ username: { type: String }, events: [{ type: ObjectId, ref: 'Event' // Reference to some EventSchema }] }) UserSchema.set('autoIndex', true) module.exports = mongoose.model('User', UserSchema) 

使用mongoose的填充方法

 // controller.js const mongoose = require('mongoose') const User = require('./usermodel.js') let query = User.findOne({ name: "Person" }) query.exec((err, user) => { if (err) { console.log(err) } user.events = events // user.events is now an array of events }) 

@dex提供的解决scheme为我工作。 但是我想添加一些也适用于我的东西:使用

 let UserSchema = new Schema({ username: { type: String }, events: [{ type: ObjectId, ref: 'Event' // Reference to some EventSchema }] }) 

如果你想创build一个数组引用。 但是,如果你想要的是一个对象引用,也就是我认为你可能正在寻找的对象引用,请删除 prop的括号,如下所示:

 let UserSchema = new Schema({ username: { type: String }, events: { type: ObjectId, ref: 'Event' // Reference to some EventSchema } }) 

看看这2个片段。 在第二种情况下,键事件的值prop不包含对象def的括号。