【问题标题】:How do I $push a value to an array within an embedded document in MongoDB using Mongoose?如何使用 Mongoose 将值推送到 MongoDB 中嵌入文档中的数组?
【发布时间】:2014-12-20 07:24:08
【问题描述】:

这似乎是 MongoDB 的一个未解决问题,https://jira.mongodb.org/browse/SERVER-831,但我不确定是否真的有解决方案,我只是在以错误的方式思考和研究。

这是我的架构的一个子集:

var myModel = new mongoose.Schema({

  arrayA: [{
    subArrayA: [{
        fieldA: String
    }],
    subArrayB: [{
        fieldB: String
    }]
  }],

});

我想通过将值推入 subArrayA 来更新它。我试过以各种方式做到这一点,但没有成功。这是最简单的尝试:

myModel.findByIdAndUpdate(req.mymodel.arrayA.id(req.params.id), {
        $push: {
            subArrayA: {
                fieldA: valA
            }
        }
}, function(err) {
     // some stuff
});

当直接推送到 arrayA 时,这可以正常工作。例如,下面的代码以我希望的方式执行 - 通过将值推送到 arrayA:

myModel.findByIdAndUpdate(req.mymodel.id, {
    $push: {
        arrayA: {
            fieldA: valA
        }
    }
}, function(err) {
     // some stuff
});

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    您似乎正在寻找"dot notation"。这是一种指定对象的子元素而不指定整个事物的方法。

    但您确实指定了一个实际模型,而您的架构却没有:

    var Model = mongoose.model( "Model", myModel );
    mongoose.connect('mongodb://localhost/test');
    
    Model.findByIdAndUpdate(req.mymodel.arrayA.id(req.params.id), {
            "$push": {
                "arrayA.subArrayA": {
                    "fieldA": valA
                }
            }
    }, function(err) {
         // some stuff
    });
    

    所以现在您可以在不覆盖给定级别的整个对象的情况下标记更新。

    【讨论】:

    • 感谢您的快速回复。我之前遇到了点符号,并尝试了您上面建议的内容。文档没有更新,我也没有收到错误消息。我在想我可能必须修改 findByIDAndUpdate 中的第一个参数,因为我在 $push 中引用 arrayA 并将其定位在 find 参数中......不确定它会是什么样子或者是否有必要。
    • @JayTolla 什么错误?这与您指定的结构相匹配,因此错误必须与其他内容有关。
    • 我没有收到错误消息。该文档没有更新,也没有抛出任何错误。我引用的“// some stuff”正在执行,但该条目未出现在数据库中。
    • @JayTolla 你真的定义了一个模型吗?你真的打电话给mogoose.connect吗?您是否知道模型名称默认为“plauralize”?所以在这种情况下,集合将是“模型”。查看额外内容。
    • 是的。我发布的最后一段代码与应用程序的其他部分一样正常工作。
    【解决方案2】:

    我能够使用 MongooseArray 方法“push”来实现这一点。

    req.mymodel.arrayA.id(req.params.id).subArrayA.push({fieldA:ValA});
    
    req.mymodel.save(function (err) {
        // some stuff
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2014-04-30
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多