2017-07-27 51 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

相關問題