mongodb中的嵌套子文档更新

时间:2016-11-05 12:51:20

标签: node.js mongodb mongoose

 {
    "_id": "581dc52e2c26be354164d528",
    "name": "vipin",
    "__v": 0,
    "post": [
      {
        "like": "today",
        "_id": "581dc52e2c26be354164d529",
        "comment": [
          {
            "date": "today",
            "username": "vipin",
            "_id": "581dc52e2c26be354164d52a",
            "detail": [
              {
                "time": "now",
                "day": "saturday",
                "_id": "581dc52e2c26be354164d52b"
              }
            ]
          }
        ]
      }
    ]
  },

我有一个嵌套的子文档。我想更新注释.date.but我不能这样做。我想嵌套子文档更新,但查询不起作用。

 Test.update({"_id":"581dc52e2c26be354164d528","post._id":"581dc52e2c26be354164d529","comment._id":"581dc52e2c26be354164d52a" },{
         "$set":{
            "post.$.comment.0.date.0":"tommorow"
        }
    },function(err,data){
        if(data){
            res.json(data)
        };
        if(err){
            res.json(err)
        }
    })
}

我的查询现在有效.plzz任何人都建议我。

2 个答案:

答案 0 :(得分:1)

mongodb不支持位置运算符匹配嵌套数组。检查此问题它仍然处于打开状态: https://jira.mongodb.org/browse/SERVER-831

解决方法:使用聚合和获取所需的子文档进行修改并使用更新查询更新子文档。

答案 1 :(得分:1)

Okkk.we可以在mongodb中更新我们的嵌套子文档。这是我们的架构。

var Post = new mongoose.Schema({
    name:String,
    post:[{
        like:String,
        comment:[{
            date:String,
            username:String,
            detail:{
                time:String,
                day:String
            }
        }]
    }]
})

现在我们可以在mongoDb中更新我们选择的字段。如果你的文档包含多个字段数组,比如post,comment,那么它可能很差。但是我们可以使用很多对象。比......我们没有更新问题。

post:[{
        like:String,
        comment:{
            date:String,
            username:String,
            detail:{
                time:String,
                day:String,
                address:{
                    street:String,
                    house:String
                }
            }
        }
    }]
})

所以我们有第一个Schema的解决方案是这样的。我们的mongoDb查询工作正常。所以检查一下......

  • 对于第一个schema.if我们在子文档中占用了多个数组。

    Test.update({ “post._id”: “58206a6aa7b5b99e32b7eb58”},     {$集:{     “$后comment.0.detail.time”: “aajtk”}},

  • 用于第二个模式。如果我们采用的不仅仅是对象。

    db.tests.update({ “post._id”:的ObjectId( “58204e89cfee37f023a567bd”)},{$设置:{ “$后comment.detail.time”: “新闻”}})