【问题标题】:Build a filter on same node在同一节点上构建过滤器
【发布时间】:2018-10-20 04:27:15
【问题描述】:

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

"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 Builder 作为键和值,但这并没有将它们组合在一起来执行过滤器。它看到有一个带有“主要位置”的键,并且属性中还有一个带有“加拿大”的值 并将返回上述对象。

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

【问题讨论】:

    标签: c# mongodb filter


    【解决方案1】:

    你需要使用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")
    

    【讨论】:

    • 效果很好!谢谢!
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多