mongoose:如何插入一个单独的子文档 – 不是一个数组

在mongoose你可以声明一个子文档的架构如下:

var childSchema = new mongoose.Schema({ name: String, age: String }); var parentSchema = new mongoose.Schema({ children: [childSchema] }); var Parent = mongoose.model('Parent', parentSchema); var Child = mongoose.model('Child', childSchema); var child = new Child({name:'Joe', age: '21'}); var parent = new Parent(); parent.children = [child]; parent.save(function(err, saved) { if(err) console.error(err); }); 

似乎子文档types需要是一个数组。 我需要能够保存子文档作为一个单一的实例,而不是数组即:

  var childSchema = new mongoose.Schema({ name: String, age: String }); var parentSchema = new mongoose.Schema({ children: childSchema // not an array }); var Parent = mongoose.model('Parent', parentSchema); var Child = mongoose.model('Child', childSchema); var child = new Child({name:'Joe', age: '21'}); var parent = new Parent(); parent.children = child; // not an array parent.save(function(err, saved) { if(err) console.error(err); }); 

所以不是一个数组或ref,只是一个单一的实例子文档。 这可能吗? 如果不是,我应该使用:

 var childInstance = child.toObject(); 

OOPS! 编辑:

我完全误读你的问题。所以你想存储一个单一的子文件? 那么为什么你有名为children的财产..

您可以使用:

 var ParentSchema = new schema({ name : String, child: Object }); // etc. john.child = new Child({name: 'kiki'}); // which is actually the same as: john.child = {name:'kiki'}; john.save(); 

这样,mongoose将文档转换成一个简单的对象并存储它。 但是我没有看到这样做的用法? 它没有Schema的好处,并使用默认对象。 不把它放在数组中也阻止你添加更多的嵌套项目。

旧:

而不是将子模式直接注入到父模式中,您需要先将它们链接起来(并且要单独存储它们吗?)。

所以我们得到两个集合: parentschildren (= ParentChild )。 收集children所有文件都与特定的parents收集相关联。 并且一个parent文档具有零个,一个或多个子文档链接。

通过这种方式,您可以保持修改架构(如附加methodsstatics )的能力,并将文件整齐分开,您可以使用“孩子”效果:

 // get mongoose. var mongoose = require('mongoose'); // connect to your local pc on database myDB. mongoose.connect('mongodb://localhost:27017/myDB'); // parent schema. var parentSchema = new mongoose.Schema({ name : String, // the ObjectId's of the children links the two schema's. children : [{type:mongoose.Schema.Types.ObjectId, ref:'Child'}] }); // child schema. var childSchema = new mongoose.Schema({ name : String, // the parent's ObjectId links to the owner. parent : {type:mongoose.Schema.Types.ObjectId, ref:'Parent'} }); // model the schema's. var Child = mongoose.model('Child', childSchema), Parent = mongoose.model('Parent', parentSchema); // create a 'parent'. // we are not assigning the children yet. var john = new Parent({name:'John'}); // create two children and save them. Link them to john. var child1 = new Child({name:'Mimi', parent:john._id}), child2 = new Child({name:'Kiki', parent:john._id}); // push child to children property of john. john.children.push(child1); john.children.push(child2); // save everything. john.save(); child1.save(); child2.save(); 

这将返回以下内容:

 /** Children: [ { name: 'Mimi', parent: 537258f63eb92b3201b65e56, _id: 537258f63eb92b3201b65e57, __v: 0 }, { name: 'Kiki', parent: 537258f63eb92b3201b65e56, _id: 537258f63eb92b3201b65e58, __v: 0 } ] Parent: [ { name: 'John', _id: 537258f63eb92b3201b65e56, __v: 0, children: [ 537258f63eb92b3201b65e57, 537258f63eb92b3201b65e58 ] } ] */ 

你也可以做一个静态函数来收集parentsaddChild(child, callback) ,所以代码看起来更干净(javaísh风格)。

伪代码:

 // add custom static method. parentSchema.statics.addChild = function(child, callback) { // implementation. } // the way you call this method: parentModel.addChild(new Child.etc..); 

希望这有助于和好运(:

有时很难看到明显的。 你不需要另一个模式来实现你想要的。 您可以简单地在您的父架构中定义您的子文件,如下所示:

  var parentSchema = new mongoose.Schema({ child: { 'name' : String, 'age' : Number } // not an array, just a sub document }); var Parent = mongoose.model('Parent', parentSchema); var parent = new Parent(); parent.child.name = "Joe"; parent.child.age = 13; parent.save(function(err, saved) { if(err) console.error(err); }); 

如果2个集合的关系是1到1,那么可以使用'ref'

 var personSchema = Schema({ _id : Number, name : String, age : Number, stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] }); var storySchema = Schema({ _creator : { type: Number, ref: 'Person' }, title : String, fans : [{ type: Number, ref: 'Person' }] }); 

来源: http : //mongoosejs.com/docs/populate.html