【问题标题】:Mongoose : update nested document arrayMongoose:更新嵌套文档数组
【发布时间】:2016-10-06 04:00:09
【问题描述】:

我的收藏如下:

   "_id" : ObjectId("5751f7892ae95d601f40411d"),

   "doc" : [
    {
        "org" : ObjectId("5751f7892ae95d601f40411c"),
        "action" : 0,
        "_id" : ObjectId("5751f7892ae95d601f40411e")
    },
    {
        "org" : ObjectId("5751952cace204c507fad255"),
        "action" : 1,
        "_id" : ObjectId("575217ce341cf6512b8dff39")
    }     ]

我想用 org:5751952cace204c507fad255 更新文档中的操作字段 所以 action 等于 2 我知道这已经被回答了很多次,但它对我不起作用

这是我尝试过的,但 Collection 没有改变:

     Model.update(
    {
        "_id":ObjectId("5751f7892ae95d601f40411d"),
        "doc.org":ObjectId("5751952cace204c507fad255")
    },
    {
        "$inc": {
                "doc.$.action": 1
        }
    }
)

【问题讨论】:

  • 你从哪里得到 ObjectId() 包装器?
  • var ObjectId = require('mongoose').Types.ObjectId;我也认为找到我的收藏有问题,但我尝试了 Model.find 相同的条件并打印了结果,我的收藏被成功找到
  • 您是否尝试过在不包装字符串_ids 的情况下进行更新?
  • 是的,我都试过了。我认为我的问题不在于嵌套文档,因为我刚刚尝试更新我的集合的名称,因为它有一个字段名称: db.Employee.update({_id:ObjectId("575194e6ace204c507fad250")},{FName: "youssef"}) ,它说 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) ,但是当我去查看我的 Employee 集合时,FName 没有改变

标签: javascript node.js mongodb mongoose


【解决方案1】:

可以尝试使用位置运算符$ 来增加匹配的操作doc.$.action

喜欢:

//assume you passed modelId and orgId in request body
// According to your tag you may used mongoose so use mongoose.Types.ObjectId('5751f7892ae95d601f40411d') instead of ObjectId("5751f7892ae95d601f40411d")
// or direct req.body.modelId without convert
Model.update(
    {
        "_id": req.body.modelId,
        "doc.org": req.body.orgId
    },
    {
        "$inc": {
                "doc.$.action": 1
        }
    },
    function(error, updatedData) {
        if(error) {
            return res.status(400).send(error);
        }
        return res.status(200).send(updatedData);
    }
);

【讨论】:

  • 抱歉,我在写问题的时候忘记放 $,实际上即使使用 doc.$.action,我的收藏也没有更新
  • 您可以尝试对_iddoc.org 使用"_id": req.body.modelIdmongoose.Types.ObjectId("25...")
  • 我都试过了,但都无济于事,我也在 Mongo shell 中尝试过,当我将它添加到我的查询 {upsert: true} 时,我得到错误:“errmsg”:“位置运算符没有从查询中找到所需的匹配项。未扩展更新:doc.$.action"
  • 表示根据你的匹配条件没有找到文档。
  • 如果您想更新特定的一个文档,请使用Model.findOneAndUpdate()
猜你喜欢
  • 2017-01-24
  • 2015-07-13
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2014-09-07
相关资源
最近更新 更多