2016-11-11 6 views
0

オブジェクトの配列内の各オブジェクトのプロパティを別のオブジェクト(MyObject)のプロパティの値で更新しようとしています。私が電話しているかどうかわかりません:MongoCollectionでFind()をマルチペアタイムと呼ぶことができますか?

my_objects_collection = m_database.GetCollection(MY_OBJECTS_COLLECTION_NAME);

は、任意のパフォーマンスに影響を持っているので、私は一度だけ、それを呼び出して... Forループ内(各反復のための修正フィルターと)それに対して、新たな検索コマンドを実行してみました、以下を参照:

  MyObject my_object = null; 
      IMongoCollection<MyObject> my_objects_collection = null; 

      if (objects != null) 
      { 
       my_objects_collection = m_database.GetCollection<MyObject>(MY_OBJECTS_COLLECTION_NAME); 

       for (int i = 0; i < objects.Count; i++) 
       { 
        Expression<Func<MyObject, bool>> filter = x => (x.ID == objects[i].ID) && (x.LanguageCode == language_code); 

        my_object = await my_objects_collection.Find(filter).FirstOrDefaultAsync(); 

        if (my_object != null) 
        { objects[i].DisplayName = my_object.Name; } 
       } 
      } 

ただし、上記のコードでは次の例外がスローされます。

値をnullにすることはできません。 パラメータ名:コレクションMongoDB.Driver.Core.Misc.Ensure.IsNotNull [T](T値は、文字列paramNameに)MongoDB.Driver.IMongoCollectionExtensions.Find [TDocument(IMongoCollection 1 collection, Expression 1フィルタで 、FindOptionsで

options)

forループの中でmy_objects_collectionの割り当てを移動し、各繰り返しごとに呼び出されるようにすると、コードは例外をスローせずに機能します。

私の質問Find(または他の操作)が実行された後、MongoCollectionリファレンス(my_objects_collection)はどうなりますか?

誰かがこれについていくつかの洞察を提供できるなら、私は本当に感謝します。私のアプリケーションが動作して以来私は上に移動することができますが、私は本当にコレクションが自分の理解のためにnullであることを示す例外をスローする理由を知りたいです。

は、事前に

アンドリュー関係なく、あなたの例外の

答えて

1

をありがとう、あなたはあなたが取得し、個々のレコードの検索を実行する必要はありません、あなたはオペレータで$を使用して、これを達成できます。

結果セットをループし、各ドキュメントで更新を実行できます。これは、レコードを返すためにデータベースに対して1回の操作を実行してから、各更新ごとに1回ずつ操作を行うのではるかに効率的です。検索ごとに1つずつ、更新ごとに1つの代わりにあなたは

Builders<MyObject>.Filter.ElemMatch 

速い(未テスト)の例

if (objects != null) 
{ 
    var my_objects_collection = m_database.GetCollection<MyObject>(MY_OBJECTS_COLLECTION_NAME); 

    var filterBuilder = Builders<MyObject>.Filter; 

    var inFilter = filterBuilder.In(x => x.ID, objects.Select(x => x.ID)); 
    var andFilter = filterBuilder.And(
     inFilter, 
     filterBuilder.Eq(x => x.LanguageCode, language_code) 
    ); 

    var results = await my_objects_collection.Find(andFilter).ToListAsync(); 

    foreach(var result in results) 
    { 
     //result is going to the a database object returns which matched your filter 
    } 
} 
を使用することができます埋め込まれた配列の要素を一致させたい場合は

はまた

Builders<MyObject>.Filter.In 

を参照してください。

関連する問題