2017-07-27 6 views
0

mongoコレクションフィルタ用のフィルタを作成する必要があります。私はMongoドライバ2を.NET用に使用しています。MongoDBから.NETのデータをフィルタリングする

ここに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; 

私は私が持っていた同様の例でそれをテストし、それは私がそれは同様にあなたのために働くことを願っていますので、働いていました。

EDIT:最初の要素が明示的に必要なようです。申し訳ありませんが、私は完全な理解で質問を読んでいませんでした。最初の要素が一致する場合にのみ結果が必要な場合は、これを試してください:

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

関連する問題