Mongodb Update Query返回模糊计数

时间:2015-10-22 11:58:12

标签: mongodb

基于此示例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 是否有更好的方法从完整集合扫描中编写此查询

1 个答案:

答案 0 :(得分:0)

Qn 1和Qn 2

如果您确切知道要更改的文档,则只需指定查询参数。更新需要(至少)两个参数:查找要更新的文档的查询文档,以及描述要对找到的文档进行更改的修饰文档。$pull是修饰符。您可以使用原子更新修饰符更新文档中的特定字段,方法是将它们放在第二个参数中。像这样:

db.survery.update({},{$pull..},{multi:true});

如果您未在第一个参数中指定特定文档,则会删除所有匹配的文档,而不仅仅是一个匹配项。

运行$pull查询后,我运行db.runCommand({getLastError:1}),它说它匹配:2我认为它只是因为{multi:true}。每个文档都匹配,因为第一个查询参数留空,但只修改了真正的$pull匹配。