如何在mongodb中使用嵌套数组更新文档

时间:2018-11-18 01:43:12

标签: mongodb

我在“事件”集合中有一个具有以下结构的文档:

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

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

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

所以我尝试了以下更新:

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是否可以自己执行此操作,或者是否需要一堆逻辑。

1 个答案:

答案 0 :(得分:2)

您可以简单地执行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轮。一个要检查,另一个要根据结果采取措施。在这里,如果记录已经存在,则只需进行一次更新。