c# - 在同一节点上构建过滤器

标签 c# mongodb filter

我遇到一个问题,需要对数据库中的对象应用过滤器。 这是一个例子:

"Object": {
    "Properties" : [ 
                {
                    "Key" : "Date",
                    "Value" : "9/12/2017"
                }, 
                {
                    "Key" : "Primary Location",
                    "Value" : "Moon"
                }, 
                {
                    "Key" : "Requested By",
                    "Value" : "drei"
                }, 
                {
                    "Key" : "Secondary Location",
                    "Value" : "Canada"
                }
    ]
}

假设我想找到“主要位置”为“加拿大”的任何对象...我似乎不知道如何做到这一点。这是我的尝试:

var builder = Builders<Object>.Filter;
FilterDefinition<Object> filter = builder.And(
                 builder.Eq("Properties.Key", "Primary Location"),
                 builder.Eq("Properties.Value", "Canada"));

本质上,我对键和值使用 And 构建器,但这不会将它们组合在一起来执行过滤器。它看到有一个带有“主要位置”的键,并且属性中还有一个带有“加拿大”的值 并将返回上述对象。

我应该如何编写过滤器来过滤相同的值和 key 对?

最佳答案

您需要使用ElemMatch :

var builder = Builders<Object>.Filter;
var subbuilder = Builders<SubObject>.Filter;
FilterDefinition<Object> filter 
    = builder.ElemMatch("Properties", subbuilder.And(
           subbuilder .Eq("Key", "Primary Location"),
           subbuilder .Eq("Value", "Canada")
      ));

这还允许您使用 positional operator $执行更新时:

updateBuilder.Set("Properties.$.Value", "Test")

或者如果您使用表达式:

updateBuilder.Set(o => o.Properties[-1].Value, "Test")

关于c# - 在同一节点上构建过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50263770/

相关文章:

C# - 如何将 10 个字节转换为 unsigned long

基类中的 C# 泛型类型

mongodb - MongoDB聚合框架的索引优化

javascript - 如何过滤数据表中的日期范围?

java - 过滤器/组件模式而不是笨拙的继承?

c# - 在 Word 2010 中禁用另存为按钮

c# - 引用冲突

mongodb - 为什么我的更新函数返回新查询但不更新数据库?

mongodb - Grails 3.0.1 不支持 application.yml mongo 配置

filter - 我如何自己编写 Matlab "filter"函数?