使用.NET驱动程序从MongoDB过滤数据

时间:2017-07-27 09:47:22

标签: c# .net mongodb linq

我需要为我的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);
        }
    });

我尝试使用这两种方法来应用嵌套属性条件。但它永远不会从数据库中返回任何文件。

1 个答案:

答案 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;

喝彩!