我遇到一个问题,需要对数据库中的对象应用过滤器。 这是一个例子:
"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/