最终目标是在每个partners对象都不存在的情况下向pathway列表中添加一个新的合作伙伴。如果pathway_name不等于Engagement Team。
例如,我想添加以下合作伙伴:
{
"_id" : ObjectId("5dd5762be13e15a73f042ce5"),
"partner" : ObjectId("5dd57633bf0cbbbb36bc112f")
} "pathways" : [
{
"_id" : ObjectId("5d837689b57cc711487f1cf0"),
"pathway_name" : "Electronics Technology with Advanced Manufacturing Mechatronics",
"partners" : [
{
"_id" : ObjectId("5d837ab8b57cc711487f1d28"),
"partner" : ObjectId("5d837426b57cc711487f1c96")
}
]
},
{
"_id" : ObjectId("5d837694b57cc711487f1cf1"),
"pathway_name" : "Pre-Mechanical Engineering",
"partners" : [
{
"_id" : ObjectId("5d837acfb57cc711487f1d29"),
"partner" : ObjectId("5d837421b57cc711487f1c92")
}
]
},
{
"_id" : ObjectId("5da6055da0eb361cc8da26dc"),
"pathway_name" : "Engagement Team",
"partners" : [
{
"_id" : ObjectId("5da60711a0eb361cc8da26f0"),
"partner" : ObjectId("5d83749fb57cc711487f1cc2")
}
]
}
], 我当前的查询如下,我不知道如何添加只添加合作伙伴的逻辑,如果它们不基于partner字段本身,而不是基于合作伙伴对象的_id字段。
db.getCollection("schools").updateMany({}, $addToSet:{"pathways$[].partners"})
预期结果:
"pathways" : [
{
"_id" : ObjectId("5d837689b57cc711487f1cf0"),
"pathway_name" : "Electronics Technology with Advanced Manufacturing Mechatronics",
"partners" : [
{
"_id" : ObjectId("5d837ab8b57cc711487f1d28"),
"partner" : ObjectId("5d837426b57cc711487f1c96")
},
{
"_id" : ObjectId("5dd5762be13e15a73f042ce5"),
"partner" : ObjectId("5dd57633bf0cbbbb36bc112f")
}
]
},
{
"_id" : ObjectId("5d837694b57cc711487f1cf1"),
"pathway_name" : "Pre-Mechanical Engineering",
"partners" : [
{
"_id" : ObjectId("5d837acfb57cc711487f1d29"),
"partner" : ObjectId("5d837421b57cc711487f1c92")
},
{
"_id" : ObjectId("5dd5762be13e15a73f042ce5"),
"partner" : ObjectId("5dd57633bf0cbbbb36bc112f")
}
]
},
{
"_id" : ObjectId("5da6055da0eb361cc8da26dc"),
"pathway_name" : "Engagement Team",
"partners" : [
{
"_id" : ObjectId("5da60711a0eb361cc8da26f0"),
"partner" : ObjectId("5d83749fb57cc711487f1cc2")
}
]
}
], 发布于 2019-11-20 22:39:33
请试一试,让我知道:
db.getCollection("schools").update(
{},
{
$push: {
'pathways.$[eachPathway].partners': {
"_id": ObjectId("5dd5762be13e15a73f042ce5"),
"partner": ObjectId("5dd57633bf0cbbbb36bc112f")
}
}
},
{ arrayFilters: [{ $and: [{ "eachPathway.pathway_name": { $ne: "Engagement Team" } },
{"eachPathway.partners._id":{$ne: ObjectId("5dd5762be13e15a73f042ce5")}}]}], multi: true }
)注意:似乎不能对整个对象进行比较,所以我们需要至少比较输入对象中的一个字段和数组中的对象中的相同字段。最后,我们可以使用$push,因为重复的对象已经被过滤掉了,但是如果您需要整个对象比较的话,我们不确定如何实现它--我认为可能不需要它。
可能会看到此错误或没有更新文档:
路径'pathways.$eachPathway.partners‘中找不到标识符'eachPathway’的数组过滤器
简而言之,这是因为robo3T或其他正在使用的mongoDB客户端无法处理arrayFilters,所以要测试这个查询,请直接使用代码测试它。
参考文献: No array filter issue
https://stackoverflow.com/questions/58960062
复制相似问题