我需要为我的mongo集合过滤器创建一个过滤器。我正在使用Mongo驱动程序2 for .NET。
这是我的JSON。
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;
}
并过滤代码: -
final Single<List<Integer>> single = api.call();
Maybe<List<Integer>> maybe = disk.call();
Single <List<Integer>> composedSingle = maybe.flatMapSingle(new Function<List<Integer>, SingleSource<?>>() {
@Override
public SingleSource<?> apply(List<Integer> integers) throws Exception {
if(integers.isEmpty()) return single;
else return Single.just(integers);
}
});
我尝试使用这两种方法来应用嵌套属性条件。但它永远不会从数据库中返回任何文件。
答案 0 :(得分:1)
也许是这样的?
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;
喝彩!