C# 使用.NET驱动程序从MongoDB筛选数据
我需要为我的mongo集合过滤器创建一个过滤器。我正在使用.NET的Mongo驱动程序2 这是我的JSONC# 使用.NET驱动程序从MongoDB筛选数据,c#,.net,mongodb,linq,C#,.net,Mongodb,Linq,我需要为我的mongo集合过滤器创建一个过滤器。我正在使用.NET的Mongo驱动程序2 这是我的JSON [ { "a": "val_a0", "b": "val_b0", "arr":[ { "c": "val_c0", "d": "val_d0" }, { "c": "
[
{
"a": "val_a0",
"b": "val_b0",
"arr":[
{
"c": "val_c0",
"d": "val_d0"
},
{
"c": "val_c1",
"d": "val_d1"
},
{
"c": "val_c2",
"d": "val_d2"
}
]
},
{
"a": "val_a1",
"b": "val_b1",
"arr":[
{
"c": "val_c3",
"d": "val_d3"
},
{
"c": "val_c4",
"d": "val_d4"
},
{
"c": "val_c5",
"d": "val_d5"
}
]
},
...
]
我需要在根级属性a和嵌套属性c上应用过滤器。我的过滤代码是:-
public class MyFilterClass
{
public string a { get; set; }
public MyFilterNestedClass nested { get; set; }
}
public class MyFilterNestedClass
{
public string c { get; set; }
}
和过滤器代码:-
public FilterDefinition<MyClass> Build(MyFilterClass filter)
{
var _filterDef = Builders<MyClass>.Filter.Empty;
_filterDef &= Builders<MyClass>.Filter.Eq(t => t.a, filter.a); // Filter by root level property [a]
// Filter by nested level property [c]
// First way
_filterDef &= Builders<MyClass>.Filter.Eq(t => t.arr.First(w => w.c == filter.MyFilterNestedClass.c).c, filter.arr.c);
// Second way
_filterDef &= builders<MyClass>.filter.where(t => t.a == filter.a &&
t.arr.first(w => w.c == filter.MyFilterNestedClass.c) != null);
return _filterDef;
}
我尝试使用这两种方法来应用嵌套属性条件。但它从不从数据库返回任何文档。可能是这样的吗
var filter = Builders<MyClass>.Filter.And(
Builders<MyClass>.Filter.Eq(t => t.a, filter.a),
Builders<MyClass>.Filter.ElemMatch(t => t.arr, i => i.c == filter.nested.c));
return filter;
我测试了类似的例子,我有它的工作,所以我希望它也会为您工作
编辑:似乎您需要明确的第一个元素。对不起,我没有完全理解这个问题。如果仅当第一个元素匹配时才需要结果,请尝试以下操作:
var filter = Builders<MyClass>.Filter.And(
Builders<MyClass>.Filter.Eq(t => t.a, filter.a),
Builders<MyClass>.Filter.Eq(t => t.arr.ElementAt(0).c, filter.nested.c));
return filter;
干杯 谢谢。第一个问题是我需要的。但它返回结果中的所有arr子对象,而不是我应用的条件。这只是一个过滤器,你能分享你用来检索数据的完整代码吗?这是代码。包括你的第一个片段。只是类名是不同的。这是一种使用T使其成为泛型的方法吗