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

发布于 2024-12-19 15:31:11 字数 643 浏览 2 评论 0原文

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

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

我的更新是:

{ "comments.$.deleted": true }

但是,奇怪的是,当我传递一个不存在的评论 id+author 组合时,它只更新了第一个匹配的评论以此 作者。

有什么想法为什么会发生这种情况吗?

编辑: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);

I tried to update an existing document with two dot notation parameters, my query:

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

my update was:

{ "comments.$.deleted": true }

However, weirdly enough, when I passed a non-existent combination of comment id+author, it just updated the first matching comment by that author.

Any ideas why that's happening?

EDIT: C# Code sample

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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

真心难拥有 2024-12-26 15:31:11

如果您希望 _id 和作者位于同一评论中,则需要 $elemMatch。确实,您的查询(包括作者)没有多大意义,因为 id 应该尽可能唯一,不是吗?

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

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

You want $elemMatch if you want the _id and author to be in the same comment. Really, your query doesn't make much sense including the author as the id should be as unique as you can get, no?

It is based on the first matching array element which replaces the "$" in for the update.

This is working by design. It is similar to an or since it can find a document which both has the _id and an author that match in any of the array elements.

放肆 2024-12-26 15:31:11

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

在您的情况下,您要求一个文档,其中:

  1. _id 等于某个值
  2. 注释数组包含一些文档,其中 _id 等于某个值
  3. 注释数组包含一些文档,其中作者等于某个值

您的文档中没有任何 内容查询表明 2. 和 3. 需要通过同一个文档来满足。

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

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

The query is not working the way you are expecting it to. Basically, when using the $ positional notation you need to make sure that your query only has one clause that queries an array, otherwise it is ambiguous which of the two array comparisons the $ should refer to.

In your case, you are asking for a document where:

  1. The _id is equal to some value
  2. The comments array contains some document where the _id is equal to some value
  3. The comments array contains some document where the author is equal to some value

Nothing in your query says that 2. and 3. need to be satisfied by the same document.

So even though you are using a non-existent combination of comment._id and comment.author, your comment array does have at least one entry where the _id is equal to your search value and some other entry (just not the same one) where the author is equal to your search value.

Since the author was the last one checked, that's what set the value of the $, and that's why that array element got updated.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文