Mongo - 点符号的工作方式类似$或?无法提供多个参数?

时间:2011-12-06 21:14:33

标签: mongodb mongodb-.net-driver

我尝试使用两个点表示法参数更新现有文档,我的查询:

{ _id: "4eda5...", comments._id: "4eda6...", comments.author: "john" }

我的更新是:

{ "comments.$.deleted": true }

然而,奇怪的是,当我通过一个不存在的评论ID +作者组合时,它刚刚更新了该作者的第一个匹配评论。

为什么会发生这种情况?

编辑:C#代码示例

var query = Query.And(Query.EQ("_id", itemId), Query.EQ("cmts._id", commentId));
if (!string.IsNullOrEmpty(author))
    query = Query.And(query, Query.EQ("cmts.Author", author));

var update = Update.Set("cmts.$.deleted", true);
var result = myCol.Update(query, update, UpdateFlags.None, SafeMode.True);

2 个答案:

答案 0 :(得分:1)

如果您希望_id和作者在同一条评论中,您需要$ elemMatch。真的,你的查询没有多大意义,包括作者,因为id应该是你能得到的唯一,不是吗?

它基于第一个匹配的数组元素,它替换了更新中的“$”。

这是设计工作。它类似于或者因为它可以找到一个文件,它具有_id和在任何数组元素中匹配的作者。

答案 1 :(得分:0)

查询无法按照您期望的方式运行。基本上,当使用$ position表示法时,您需要确保您的查询只有一个查询数组的子句,否则$应该引用的两个数组比较中的哪一个是不明确的。

在您的情况下,您要求提供以下文件:

  1. _id等于某个值
  2. comments数组包含一些_id等于某个值的文档
  3. comments数组包含一些文档,其中作者等于某个值
  4. 您的查询中没有任何内容表明同一文档需要满足2.和3.

    因此,即使您使用不存在的comment._id和comment.author组合,您的注释数组也至少有一个条目,其中_id等于您的搜索值和其他一些条目(只是不一样)一)作者等于你的搜索值。

    由于作者是最后一个检查过的,这就是设置$的值的原因,这就是数组元素更新的原因。