Mongodb Mongo-dot表示法的工作原理类似于$or?Can';你不能提供多个参数吗?

Mongodb Mongo-dot表示法的工作原理类似于$or?Can';你不能提供多个参数吗?,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我尝试使用两个点符号参数更新现有文档,我的查询: {u id:“4eda5…”,注释。{u id:“4eda6…”,注释。作者:“john”} 我的更新是: {“comments.$.deleted”:true} 然而,奇怪的是,当我传递一个不存在的注释id+作者组合时,它只是更新了该作者的第一条匹配注释 知道为什么会这样吗 编辑:C#代码示例 var query = Query.And(Query.EQ("_id", itemId), Query.EQ("cmts._id", commentI

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

{u id:“4eda5…”,注释。{u id:“4eda6…”,注释。作者:“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);

如果希望_id和作者位于同一条注释中,则需要$elemMatch。真的,你的查询没有多大意义,包括作者,因为id应该是唯一的,因为你可以得到,不是吗

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


这是设计好的。它类似于or,因为它可以找到在任何数组元素中都具有匹配的_id和作者的文档。

查询的工作方式与您期望的不同。基本上,当使用$positional表示法时,需要确保查询中只有一个子句查询数组,否则就不清楚$应该引用两个数组比较中的哪一个

在您的情况下,您需要一份文件,其中:

  • _id等于某个值
  • comments数组包含一些文档,其中_id等于某个值
  • comments数组包含作者等于某个值的文档

  • 您的查询中没有任何内容表明2。三,。需要通过相同的文档来满足

    因此,即使您使用的是comment.\u id和comment.author这两个不存在的组合,您的comment数组也至少有一个条目,其中\u id等于您的搜索值,而其他条目(只是不相同)的作者等于您的搜索值


    因为作者是最后一个被检查的人,所以设置了$的值,这就是为什么数组元素被更新的原因。

    您能再详细说明一下吗?你用过官方的C#driver吗?如果是这样的话,你能展示一下你使用的C代码吗?添加了一个C代码示例,我不知道如何详细说明-一个错误id(但正确的作者)的注释会被更新。@mnemosyn,是的,官方驱动程序HMM,这只是一个怀疑:试着去掉子文档中的
    “\id”
    字段。在我给出的一些回答中,这就是罪魁祸首。啊。。。这是一个安全特性(有点,呵呵)。我希望管理员和发表评论的用户能够删除它。如果管理员正在执行此操作-只有_id应该匹配,如果作者正在执行此操作-则_id和作者都应该匹配。我这样做是为了避免拉文档和检查谁发布了评论——有更好的方法吗?这就是我所能想到的——id是唯一的。感谢$elemMatch指针-我会检查它(我希望它可以分步骤构建,这样我仍然可以使用
    如果
    与用户名一起使用)>您的查询中没有任何内容表明2。三,。需要通过相同的文档来满足。这是令人困惑的部分,我希望
    Query.And()
    能够处理这个问题,但我想它在数组中的工作方式是不同的