我尝试使用两个点表示法参数更新现有文档,我的查询:
{ _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);
答案 0 :(得分:1)
如果您希望_id和作者在同一条评论中,您需要$ elemMatch。真的,你的查询没有多大意义,包括作者,因为id应该是你能得到的唯一,不是吗?
它基于第一个匹配的数组元素,它替换了更新中的“$”。
这是设计工作。它类似于或者因为它可以找到一个文件,它具有_id和在任何数组元素中匹配的作者。
答案 1 :(得分:0)
查询无法按照您期望的方式运行。基本上,当使用$ position表示法时,您需要确保您的查询只有一个查询数组的子句,否则$应该引用的两个数组比较中的哪一个是不明确的。
在您的情况下,您要求提供以下文件:
您的查询中没有任何内容表明同一文档需要满足2.和3.
因此,即使您使用不存在的comment._id和comment.author组合,您的注释数组也至少有一个条目,其中_id等于您的搜索值和其他一些条目(只是不一样)一)作者等于你的搜索值。
由于作者是最后一个检查过的,这就是设置$的值的原因,这就是数组元素更新的原因。