mongoose:如何插入单个子文档 - 而不是数组

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)

sal*_*nap 5

有时很难看出明显的.您不需要另一个架构来实现您想要的.您可以在父模式中定义子文档,如下所示:

    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)

  • 这样做的缺点是没有对孩子进行验证...请参阅https://github.com/LearnBoost/mongoose/pull/585 (3认同)

Kai*_*Kai 4

哎呀!编辑:

\n\n

我完全误解了你的问题..那么你想存储一个文档吗?那为什么你把这个财产命名为children..

\n\n

您可以使用:

\n\n
var 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();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,mongoose 将文档转换为简单的对象并存储它。但我不明白这样做有什么用?它没有架构的好处,而是用作默认对象。不将其放入数组中还会阻止您添加更多嵌套项。

\n\n

老的:

\n\n

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

\n\n

所以我们得到两个集合:parentschildren(= Parent&& Child)。所有馆藏文件children均链接至特定parents馆藏。一个parent文档可以children链接零个、一个或多个文档。

\n\n

通过这种方式,您可以保持修改架构的能力(例如附加methodsstatics)并使文档整齐地分开,并且您可以获得您想要的“子”效果:

\n\n
//  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();\n
Run 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*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以为 collection parents:创建一个静态函数addChild(child, callback),这样代码看起来更干净(java\xc3\xadsh 风格)。

\n\n

伪代码:

\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..);\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这有帮助,祝你好运(:

\n