Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mongodb中使用嵌套数组更新文档_Mongodb - Fatal编程技术网

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

如何在mongodb中使用嵌套数组更新文档,mongodb,Mongodb,我在“事件”集合中有一个文档,其结构如下: { "_id" : "abc", "text" : "some text", } 我希望通过插入名为guestOwner的数组来更新文档。我想要的结果将更新文档,如下所示: { "_id" : "abc", "text" : "some text", "guestOwner" : [ { "name" : "JACK BLACK", "guests" : [ "

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

{ 
  "_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]。名称?不确定mongo是否能够独立完成这项工作,或者是否需要一系列逻辑

您只需执行
更新
,其中在
查询部分
中指定名称:

db.events.update({
  "_id" : ObjectId("someId"), "guestOwner.name": "JACK BLACK"}, {
  $push: { "guestOwner.$.guests": "GUEST11" // etc }
})
如果这将更新的元素数返回为1,则可以继续,因为
名称
存在,等等

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

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

这将为您节省一次通话,因为如果您必须检查该记录是否存在,您将始终进行两次通话。一个检查,另一个根据结果采取行动。在这里,如果记录已经存在,您只需执行一次更新。

您只需执行一次
更新
,其中在
查询部分中指定名称:

db.events.update({
  "_id" : ObjectId("someId"), "guestOwner.name": "JACK BLACK"}, {
  $push: { "guestOwner.$.guests": "GUEST11" // etc }
})
如果这将更新的元素数返回为1,则可以继续,因为
名称
存在,等等

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

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

这将为您节省一次通话,因为如果您必须检查该记录是否存在,您将始终进行两次通话。一个检查,另一个根据结果采取行动。在这里,如果记录已经存在,您只需执行一次更新。

啊,是的。很有道理。啊,是的。这很有道理。