基于此示例Mongo Pull,我们有以下集合
*.*
以下查询从数组中删除匹配的元素。
{
_id: 1,
results: [
{ item: "A", score: 5 },
{ item: "B", score: 8, comment: "Strongly agree" }
]
}
{
_id: 2,
results: [
{ item: "C", score: 8, comment: "Strongly agree" },
{ item: "B", score: 4 }
]
}
查询完美无缺。但我不确定下面的
Qn 1 。为什么上述查询总是返回“已更新2条现有记录”,即使没有匹配的文档
或者我用查询参数提供了更新 - 注意查询需要elemMatch和$ pull不需要elemMatch
db.survey.update(
{ },
{ $pull: { results: { score: 8 , item: "B" } } },
{ multi: true }
)
按预期返回更新0记录。
Qn 2 。在执行更新拉取操作时是否真的有必要提供查询参数。不明白这一点,只需查找$ pull标准文档而无需在udpate查询参数中明确设置。
Qn 3 是否有更好的方法从完整集合扫描中编写此查询
答案 0 :(得分:0)
Qn 1和Qn 2 :
如果您确切知道要更改的文档,则只需指定查询参数。更新需要(至少)两个参数:查找要更新的文档的查询文档,以及描述要对找到的文档进行更改的修饰文档。。 $pull
是修饰符。您可以使用原子更新修饰符更新文档中的特定字段,方法是将它们放在第二个参数中。像这样:
db.survery.update({},{$pull..},{multi:true});
如果您未在第一个参数中指定特定文档,则会删除所有匹配的文档,而不仅仅是一个匹配项。
运行$pull
查询后,我运行db.runCommand({getLastError:1})
,它说它匹配:2我认为它只是因为{multi:true}
。每个文档都匹配,因为第一个查询参数留空,但只修改了真正的$pull
匹配。