【问题标题】:How to update document with nested array in mongodb [duplicate]如何在mongodb中使用嵌套数组更新文档[重复]
【发布时间】:2019-04-20 18:48:12
【问题描述】:

我在集合“事件”中有一个文档,其结构如下:

{ 
  "_id" : "abc",
  "text" : "some text",
}

我希望通过插入一个名为 guestOwner 的数组来更新文档。我想要的结果会像这样更新文档:

{ 
  "_id" : "abc",
  "text" : "some text",
  "guestOwner" : [
    {
        "name" : "JACK BLACK", 
        "guests" : [
            "GUEST1",
            "GUEST2"
        ]
    }
  ]
}

所以我尝试了以下内容的 mongo 更新:

db.events.update({ _id: eventid }, { $push: { guestOwner: { name: username, guests: allGuests } } });

其中 'username' 是一个字符串,而 'allGuests' 是一个名称数组 ["Guest1", "Guest2"]

对我来说,问题是当文档发生后续更新时,如果名称相同,我想将新的“allGuests”数组推送到现有数组中。例如,如果使用 'allGuests' = ["GUEST3"] 进行第二次更新,并且使用相同的名称 = "JACK BLACK",我希望文档为:

{ 
  "_id" : "abc",
  "text" : "some text",
  "guestOwner" : [
    {
        "name" : "JACK BLACK", 
        "guests" : [
            "GUEST1",
            "GUEST2"
            "GUEST3"
        ]
    }
  ]
}

但是,如果使用不同的名称更新文档 = 'JOHN SMITH' 其中 allGuests 数组 = ["GUEST3"],它将创建:

{ 
  "_id" : "abc",
  "text" : "some text",
  "guestOwner" : [
    {
        "name" : "JACK BLACK", 
        "guests" : [
            "GUEST1",
            "GUEST2"
        ]
    },
    {
        "name" : "JOHN SMITH", 
        "guests" : [
            "GUEST3"
        ]
    }
  ]
}

我是否需要围绕 mongo 更新的条件语句来检查 guestOwner[0].name?不确定 mongo 是否可以自己执行此操作,或者是否需要一堆逻辑。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以简单地执行update,在query section 中您可以指定名称:

    db.events.update({
      "_id" : ObjectId("someId"), "guestOwner.name": "JACK BLACK"}, {
      $push: { "guestOwner.$.guests": "GUEST11" // etc }
    })
    

    如果这将更新元素的数量返回为 1,那么你就可以走了,因为 name 存在等。

    如果它返回0,则该名称不存在,因此您可以运行:

    db.events.update({"_id" : ObjectId("someId")}, {
      $addToSet: { guestOwner: { name: "JACK BLACK" // etc }}
    })
    

    这将为您节省一个电话,因为如果您必须检查记录是否存在,您总是会进行 2 轮。一个检查,另一个根据结果采取行动。在这里,如果记录已经存在,您只需进行一次更新。

    【讨论】:

    • 啊,是的。很有道理。
    猜你喜欢
    • 2017-06-05
    • 2016-11-23
    • 2017-04-28
    • 2013-03-19
    • 2017-01-13
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多