Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.NET驱动程序从MongoDB筛选数据_C#_.net_Mongodb_Linq - Fatal编程技术网

C# 使用.NET驱动程序从MongoDB筛选数据

C# 使用.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": "

我需要为我的mongo集合过滤器创建一个过滤器。我正在使用.NET的Mongo驱动程序2

这是我的JSON

[
    {
        "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使其成为泛型的方法吗