【问题标题】:Querying on arrays in MongoDB C#在 MongoDB C# 中查询数组
【发布时间】:2013-12-04 10:28:26
【问题描述】:

我有一个具有以下文档类型的集合:

{
 field1: 1,
 field2: "test1",
 field3: [1,2,3]
}

假设我的收藏中有以下文档(忽略field1field2,只考虑field3

收藏:

doc1-  {...
        field3: [3,4,5,6]
       }
doc2-  {...
        field3: [3,4]
       }
doc3-  {...
        field3: [1,2,3]
       }
doc4-  {...
        field3: [3,6,7]
       }

现在,我在 field3 上使用值 [3,4,6,7] 查询此集合。

因此,我在集合中执行查询的方式是,我应该获取在查询数组中存在其所有数组元素的所有文档。 就我而言,它应该返回文档doc2doc4,因为它的所有field3 元素都存在于查询中,但Query.ALL 不起作用。

如何在 MongoDB 查询中完成此操作?

(为更清晰而编辑)

为什么 $all 不起作用?

EX:如果我的查询数组是 [3,4],当我使用 Query.All("field3",new BsonValue[]{3,4}) 时, 我将获得所有带有“field3”的文档,其中包含查询数组中的所有元素,即 3 和 4。所以在这种情况下,我的结果文档将是上面示例中的 doc1 和 doc2。但我的要求只有doc2。因为我的文档的所有元素都应该在我的查询数组中,而不是相反。

为什么 $in 不起作用? 如果 quetiong 数组的至少一个元素存在于文档中,则检索它。 例如:查询数组是 [3,4],当我使用 Query.In("field3",new BsonValue[]{3,4}) 时, 结果将是集合 doc1、doc2、doc3 和 doc4 的所有 4 个文档

【问题讨论】:

  • 也许你的问题已经被问过了here

标签: c# mongodb


【解决方案1】:

看看this question

C# 驱动程序中的运算符All 或MongoDb 中的$all 考虑所有元素,如文档中的here 所述:

$all 运算符选择字段值所在的文档 包含所有指定元素的数组。

然后,假设元素34,运算符考虑数组,逻辑如下:the array contains elements 3 AND 4

如果您想考虑使用3 OR 4 的数组,我认为您应该使用Query.In(有关$in 的更多信息here)。

更新

经过您的澄清,我在 MongoDb 的网站上注意到了 this request。在该页面中,用户请求了一项功能,以便仅检索具有仅包含指定元素的数组的文档,但这实际上是不可能的。

不幸的是,我认为这是 MongoDb 以及一般来说 NoSQL 数据库的限制。

【讨论】:

  • 正如我已经提到的,Query.All 在我的系统中不起作用。由于 $all 运算符检索具有包含在查询数组中的所有数组元素的文档。
  • ..(接上一页) EX:如果我的查询数组是 [3,4],当我使用 Query.All("field3",new BsonValue[]{3,4}) 时,我将获得所有带有“field3”的文档,其中包含问题数组中的所有元素,即 3 和 4。所以在这种情况下,我的结果文档将是上面示例中的 doc1 和 doc2。但我的要求只有doc2。因为我的文档的所有元素都应该在我的查询数组中
  • @SarikaKondra 这就是我的回答所解释的。在问题中,您写道“在我的情况下,它应该返回文档 doc2 和 doc4,因为它的字段 3 的所有元素都存在于查询中”,这就是 Query.All 所做的,正如文档所解释的那样,例如您在你的评论中说。我在不知道您的要求的情况下回答了您的问题。 Query.All 检索包含查询数组中元素的文档。然后您需要改进查询以仅找到 doc2,这意味着该文档仅包含查询数组中的元素。
  • @SarikaKondra 实际上,在文档中有一个示例:“使用 $all 匹配值”,其中描述为:“以下操作使用 $all 运算符查询清单集合以查找其中tags 字段的值是一个数组,其元素包括设备、学校和书籍”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 2021-07-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多