如何更新MongoDB中的子文档?

时间:2016-03-04 06:03:21

标签: node.js mongodb put subdocument

在Mongoose中创建的更新子文档的代码无效。所以我尝试更新Mongo Shell中的子文档 这是文档(位置)和子文档(评论):

{
"_id" : ObjectId("56d8c73314fbc7e702cfb8c4"),
"name" : "Costly",
"address" : "150, Super Street",
"coords" : [
    -0.9630884,
    51.451041
],
"reviews" : [
    {
        "author" : "kyle riggen1",
        "_id" : ObjectId("56d8de74cc7f953efd8455d9"),
        "rating" : 4,
        "timestamp" : ISODate("2015-06-01T06:00:00Z"),
        "reviewText" : "will the ID work?"
    }
],
"rating" : 0,
"__v" : 2

}

以下是我更新子文档的一些尝试:
This question gave this format:

update({ 
       _id: "56d8c73314fbc7e702cfb8c4", 
       "reviews._id": ObjectId("56d8de74cc7f953efd8455d9")
   },{
       $set: {"reviews.$.rating": 1}
   }, false, true
);

这返回错误"更新未定义"如图所示:

2016-03-03T22:52:44.445-0700 E QUERY    [thread1] ReferenceError: update is not defined :
@(shell):1:1

我认为这是因为该命令不是以db.locations.update()

开头的

MongoDB documentation used this format:

db.locations.update(
   {
     _id: "56d8c73314fbc7e702cfb8c4",
     review: { $elemMatch: { author: "kyle riggen1" } }
   },
   { $set: { "location.$.rating" : 1 } }
)

这会返回有效的更新,但更新实际上并未如下所示发生:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

This question used this format:

db.locations.update({
    _id: "56d8c73314fbc7e702cfb8c4",
    'review.author': 'kyle riggen1'
  },
  { $set: { 'review.$.rating': 1 }}
)

返回与MongoDB文档相同的内容,如下所示:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

所以我猜这些查询正在运行,但我的数据没有得到更新。我的数据可能会被错误编入索引吗?即使通过Mongoose API也可以更新实际位置。

2 个答案:

答案 0 :(得分:0)

你可以通过$ push或$ addToSet来实现。

db.col.update(
        { name: 'reviews', 'list.id': 2 }, 
        {$push: {'list.$.items': {id: 5, name: 'item5'}}}
    )

参见mongodb手册

中的参考资料

https://docs.mongodb.org/manual/reference/operator/update/push/

答案 1 :(得分:-1)

请知道db.collection.update( criteria, objNew, upsert, multi )

  1. criteria:匹配条件
  2. objNew:更新内容
  3. upsert:真或假
    • true:如果不存在,请将其插入
    • false:如果不存在,请不要插入
  4. multi:真或假
    • true:更新所有匹配的文件
    • false:仅更新第一个匹配的文档