【问题标题】:Can't .push() sub-document into Mongoose array无法将 .push() 子文档放入 Mongoose 数组
【发布时间】:2014-03-02 15:43:45
【问题描述】:

我有一个 MongooseJS 架构,其中父文档引用一组子文档:

var parentSchema = mongoose.Schema({
    items : [{ type: mongoose.Schema.Types.ObjectId, ref: 'Item', required: true }],
...
});

为了测试,我想用一些虚拟值填充父文档上的项目数组,而不将它们保存到 MongoDB:

var itemModel = mongoose.model('Item', itemSchema);
var item = new itemModel();
item.Blah = "test data";

但是,当我尝试将此对象推入数组时,只存储了 _id

parent.items.push(item);
console.log("...parent.items[0]: " + parent.items[0]);
console.log("...parent.items[0].Blah: " + parent.items[0].Blah);

输出:

...parent.items[0]: 52f2bb7fb03dc60000000005
...parent.items[0].Blah:  undefined

我可以以某种方式执行 `.populate('items') 的等效操作吗? (即:从 MongoDB 中读取文档时填充数组的方式)

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    在您的问题详细信息中,您自己的调查表明您正在推送该文档,因为您可以找到它的 _id 值。但这不是真正的问题。考虑下面的代码:

    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    
    mongoose.connect('mongodb://localhost/nodetest')
    
    var childSchema = new Schema({ name: 'string' });
    //var childSchema = new Schema();
    
    
    var parentSchema = new Schema({
        children: [childSchema]
    });
    
    var Parent = mongoose.model('Parent', parentSchema);
    var parent = new Parent({ children: [{ name: 'Matt' }, { name: 'Sarah'}] });
    
    var Child = mongoose.model('Child', childSchema);
    var child = new Child();
    child.Blah = 'Eat my shorts';
    parent.children.push(child);
    parent.save();
    
    console.log( parent.children[0].name );
    console.log( parent.children[1].name );
    console.log( parent.children[2] );
    console.log( parent.children[2].Blah );
    

    因此,如果问题现在不突出,请将注释行替换为 childSchema 的定义。

    // var childSchema = new Schema({ name: 'string' });
    var childSchema = new Schema();
    

    现在这清楚地表明 没有 访问器被定义,这带来了问题:

    “你的 'Blah' 访问器是否在你的架构中定义?”

    所以要么不是,要么那里的定义有类似的问题。

    【讨论】:

    • 在我的测试中,由于测试的工作方式,我没有调用 parent.save()。我怀疑这就是我无法访问子对象的原因
    • 问题不在于 save(),而在于 Schema 定义。正如我所展示的,尝试上面的代码或使用 blank Schema 对象的代码,您将看到所有访问器都失败了。 Blah 需要在您的架构中定义。
    • 不适合我,我尝试使用 findOne 并使用 save() 推送到该子文档。它创建新记录而不是将新项目推送到子文档
    猜你喜欢
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2017-01-19
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多