2016-04-03 11 views
0

Ich benutze den mongodb C# -Treiber und versuche, ein initialisiertes Array einzufügen, wenn das Feld null ist, und drücke, wenn ein Array bereits an der Adresse existiert (zu diesem Zeitpunkt nehme ich gerade an) ein Array existiert im Adressfeld, wenn es nicht null ist).mongodb C# drücken oder einfügen, wenn das Feld null ist

Ich benutze die folgende Methode, die eine falsche positive zurückgibt, dass der Wert an der Adresse null ist und daher sich selbst mit einem neuen Array überschreibt.

Könnte mir jemand auf die richtige Art und Weise zeigen, um abzufragen, ob an der Adresse ein Nullwert existiert?

public virtual async Task<UpdateResult> AddEntryToArrayAsync<X>(string address, string id, X el) 
     { 
      var isNullQuery = Builders<BsonDocument>.Filter.Eq(address, BsonNull.Value) & IdFilter(id); 
      var isNullCount = await Collection.CountAsync(isNullQuery); 

      if (isNullCount > 0) 
      { 
       var insert = Builders<BsonDocument>.Update.Set(address, new List<X>() { el }); 
       return await Collection.UpdateOneAsync(IdFilter(id), insert); 
      } 

      var update = Builders<BsonDocument>.Update.Push(address, el); 
      return await Collection.UpdateOneAsync(IdFilter(id), update); 
     } 
    protected static FilterDefinition<BsonDocument> IdFilter(string id) 
     { 
      return Builders<BsonDocument>.Filter.Eq("_id", id); 
     } 

Ich bin zuversichtlich, dass alles andere richtig funktioniert, da die korrekte Adresse jedes Mal mit der neuen init überschrieben wird. Array

Antwort

0

Dies ist meine sehr dreckige Workaround für den Moment ... Ich hoffe, jemand kann mich immer noch auf eine bessere Lösung hinweisen.

public virtual async Task<UpdateResult> AddEntryToArrayAsync<X>(string address, string id, X el) 
    { 
     try 
     { 
      var update = Builders<BsonDocument>.Update.Push(address, el); 
      return await Collection.UpdateOneAsync(IdFilter(id), update); 
     } 
     catch(MongoWriteException e) 
     { 
      if (e.WriteConcernError == null) 
      { 
       var insert = Builders<BsonDocument>.Update.Set(address, new List<X> { el }); 
       return await Collection.UpdateOneAsync(IdFilter(id), insert); 
      } 
      throw e; 
     } 
    } 
Verwandte Themen