如何在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 }}
})
这将为您节省一次通话,因为如果您必须检查该记录是否存在,您将始终进行两次通话。一个检查,另一个根据结果采取行动。在这里,如果记录已经存在,您只需执行一次更新。啊,是的。很有道理。啊,是的。这很有道理。