2016-11-11 2 views
0

Ich versuche, eine Eigenschaft für jedes Objekt innerhalb eines Arrays von Objekten mit dem Wert einer Eigenschaft für ein anderes Objekt (MyObject) zu aktualisieren. Ich bin unklar, wenn Sie anrufen:Kann Find() mehrfach auf einer MongoCollection aufgerufen werden?

my_objects_collection = m_database.GetCollection (MY_OBJECTS_COLLECTION_NAME);

keine Auswirkungen auf der Leistung hat, also versuchte ich es nur einmal und Ausführung einen neuen Befehls Suchen dagegen (mit einem modifizierten Filter für jede Iteration) innerhalb einer For ... Loop, siehe unten Aufruf:

  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; } 
       } 
      } 

Der obige Code löst jedoch die folgende Ausnahme aus:

Wert kann nicht null sein. Parametername: Sammlung

bei MongoDB.Driver.Core.Misc.Ensure.IsNotNull [T] (T-Wert, String paramName) bei MongoDB.Driver.IMongoCollectionExtensions.Find [TDocument] (IMongoCollection 1 collection, Expression 1-Filter, FindOptions Optionen)

Wenn ich die my_objects_collection Zuordnung innerhalb der for-Schleife zu bewegen, so dass es für jede Iteration genannt wird, funktioniert der Code ohne Ausnahmen zu werfen.

Daher ist meine Frage, Was passiert mit der MongoCollection-Referenz (my_objects_collection), nachdem die Suche (oder eine andere Operation) dagegen ausgeführt wird?

Ich würde wirklich zu schätzen, wenn jemand einen Einblick in diesen bieten könnte. Ich könnte weitermachen, da meine Anwendung funktioniert, aber ich möchte wirklich wissen, warum es eine Ausnahme gibt, die anzeigt, dass die Sammlung für mein eigenes Verständnis null ist.

Danke im Voraus,

Andrew

Antwort

1

Unabhängig von Ihrer Ausnahme, die Sie nicht fündig für jeden einzelnen Datensatz durchführen müssen Sie abrufen, können Sie dies mit dem $ in Bediener erreichen.

Sie könnten dann Schleife die resultset und führen Sie Ihre Update auf jedem Dokument. Dies ist weitaus effizienter, wenn Sie eine einzelne Operation für die Datenbank ausführen, um Ihre Datensätze zurückzugeben, und eine für jedes Update. Anstelle eines für jeden Abruf und eines für jedes Update.

Siehe

Builders<MyObject>.Filter.In 

Auch wenn Sie Elemente in einem eingebetteten Array passen Sie

Builders<MyObject>.Filter.ElemMatch 

Ein schnelles (ungetestet) Beispiel

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 
    } 
} 
verwenden könnten
Verwandte Themen