Sam*_*l G 4 mongoose mongodb node.js
在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);
});
Run Code Online (Sandbox Code Playgroud)
似乎子文档类型需要是一个数组.我需要能够将子文档保存为单个实例,而不是数组,即:
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);
});
Run Code Online (Sandbox Code Playgroud)
所以不是数组或ref,只是一个实例子文档.这可能吗?如果不是我应该使用:
var childInstance = child.toObject();
Run Code Online (Sandbox Code Playgroud)
有时很难看出明显的.您不需要另一个架构来实现您想要的.您可以在父模式中定义子文档,如下所示:
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);
});
Run Code Online (Sandbox Code Playgroud)
我完全误解了你的问题..那么你想存储一个子文档吗?那为什么你把这个财产命名为children..
您可以使用:
\n\nvar ParentSchema = new schema({\n name : String,\n child: Object\n});\n\n// etc.\n\njohn.child = new Child({name: 'kiki'});\n// which is actually the same as: john.child = {name:'kiki'};\njohn.save();\nRun Code Online (Sandbox Code Playgroud)\n\n这样,mongoose 将文档转换为简单的对象并存储它。但我不明白这样做有什么用?它没有架构的好处,而是用作默认对象。不将其放入数组中还会阻止您添加更多嵌套项。
\n\n您需要首先链接它们(并且您想单独存储它们,对吗?),而不是将子模式直接注入父模式。
\n\n所以我们得到两个集合:parents和children(= Parent&& Child)。所有馆藏文件children均链接至特定parents馆藏。一个parent文档可以children链接零个、一个或多个文档。
通过这种方式,您可以保持修改架构的能力(例如附加methods或statics)并使文档整齐地分开,并且您可以获得您想要的“子”效果:
// get mongoose.\nvar mongoose = require('mongoose');\n\n// connect to your local pc on database myDB.\nmongoose.connect('mongodb://localhost:27017/myDB');\n\n// parent schema.\nvar parentSchema = new mongoose.Schema({\n name : String,\n // the ObjectId's of the children links the two schema's.\n children : [{type:mongoose.Schema.Types.ObjectId, ref:'Child'}]\n});\n\n// child schema.\nvar childSchema = new mongoose.Schema({\n name : String,\n // the parent's ObjectId links to the owner.\n parent : {type:mongoose.Schema.Types.ObjectId, ref:'Parent'}\n});\n\n// model the schema's.\nvar Child = mongoose.model('Child', childSchema),\n Parent = mongoose.model('Parent', parentSchema);\n\n// create a 'parent'.\n// we are not assigning the children yet.\nvar john = new Parent({name:'John'});\n\n// create two children and save them. Link them to john.\nvar child1 = new Child({name:'Mimi', parent:john._id}),\n child2 = new Child({name:'Kiki', parent:john._id});\n\n// push child to children property of john.\njohn.children.push(child1);\njohn.children.push(child2);\n\n// save everything.\njohn.save();\nchild1.save();\nchild2.save();\nRun Code Online (Sandbox Code Playgroud)\n\n这将返回以下内容:
\n\n/**\nChildren: \n[ { name: 'Mimi', \n parent: 537258f63eb92b3201b65e56, \n _id: 537258f63eb92b3201b65e57, \n __v: 0 }, \n { name: 'Kiki', \n parent: 537258f63eb92b3201b65e56, \n _id: 537258f63eb92b3201b65e58, \n __v: 0 } ]\n\nParent:\n[ { name: 'John', \n _id: 537258f63eb92b3201b65e56, \n __v: 0, \n children: [ 537258f63eb92b3201b65e57, 537258f63eb92b3201b65e58 ] } ]\n*/\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以为 collection parents:创建一个静态函数addChild(child, callback),这样代码看起来更干净(java\xc3\xadsh 风格)。
伪代码:
\n\n// add custom static method.\nparentSchema.statics.addChild = function(child, callback) {\n // implementation.\n}\n\n// the way you call this method:\nparentModel.addChild(new Child.etc..);\nRun Code Online (Sandbox Code Playgroud)\n\n希望这有帮助,祝你好运(:
\n| 归档时间: |
|
| 查看次数: |
11563 次 |
| 最近记录: |