2017-07-27 52 views
0

我需要为我的mongo收集过滤器创建一个过滤器。我正在使用Mongo driver for .NET。使用.NET驱动程序从MongoDB中过滤数据

这是我的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; 
} 

我试着用不申请嵌套属性的标准方式。但它从不从数据库返回任何文档。

回答

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; 

干杯!

+0

谢谢。第一个查询是我需要的。但是它返回结果中的所有'arr'子对象,而不是我应用的标准。 – benjamin54

+0

没问题=)。这只是一个过滤器,你可以分享你用来检索数据的完整代码吗? – BOR4

+0

这是代码。包括你的第一个片段。只是班级名称不同。 – benjamin54

相关问题