我在“事件”集合中有一个具有以下结构的文档:
{
"_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是否可以自己执行此操作,或者是否需要一堆逻辑。
答案 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轮。一个要检查,另一个要根据结果采取措施。在这里,如果记录已经存在,则只需进行一次更新。