【问题标题】:How to perform a $setIsSubset on MongoDB using C# driver?如何使用 C# 驱动程序在 MongoDB 上执行 $setIsSubset?
【发布时间】:2018-05-01 01:55:28
【问题描述】:

我正在尝试在 MongoDB 中使用 $setIsSubset 运算符。

Documentation 说我应该写这个:

var values = Enumerable.Range(0, 10).ToArray();
var result = myCollection.Find(x => x.ExternalKeys.IsSubsetOf(values)).ToList();

但是,我遇到了以下异常:

“System.ArgumentException”类型的未处理异常发生在 MongoDB.Driver.dll

附加信息:不支持的过滤器: {myCollection}{ExternalKeys}.IsSubsetOf(value(System.Int32[]))。

ExternalKeys 属性声明为Hashset<int>

我正在使用 MongoDB 3.4 和 C# Driver 2.4.4,AFAIK 是最新版本。

【问题讨论】:

  • $setIsSubset 是一个“聚合”运算符。在 MongoDB 3.6 提供 $expr 之前,您还不能在 .Find() 中使用它。你想在这里使用Aggregate(),并使用$redact
  • 但实际上,如果您只是询问“所有这些值都存在于此数组字段中”,那么您真正想要的是$all。因此,除了您找错地方外,您的要求并不清楚。
  • 我想过滤掉mycollection 并只获取ExternalKeys 中至少有一个整数与values 变量项匹配的文档 例如:values = [40, 30, 20] ExternalKeys = [10, 20] //OK ExternalKeys = [500, 600] //not OK

标签: c# mongodb filter set


【解决方案1】:

您实际上希望 $in 在这里 “至少一个” [40, 30, 20] 匹配目标数组。这是通过AnyIn()完成的

myCollection.Find(
  Builders<BsonDocument>.Filter.AnyIn( x => x.ExternalKeys, new[] { 40, 30, 20 } )
).ToList();

$in 不仅适用于数组,而且本质上是可以匹配属性的可能值的列表。只是 MongoDB 也将数组视为匹配“它的任何值”。

所以这实际上就是您在所谓的“子集”中寻找的东西,因为目标是它与任何元素相交处进行比较的“子集”。

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多