2016-04-03 32 views
0

boşsa, mongodb C# sürücüsünü kullanıyorum ve alan boş olduğunda bir başlangıç ​​dizisi eklemeye çalışıyorum ve adreste zaten bir dizi bulunduğunda itin (bu aşamada sadece varsayım) boş değilse, adres alanında bir dizi var).mongodb C# alanı boşsa veya

Aşağıdaki adresten yararlanıyorum; bu, yanlış adresleme değerini geçersiz kılar ve bu sayede yeni bir dizi ile üzerine yazılır.

Birisi, adreste boş bir değerin olup olmadığını sorgulamak için bana doğru yolu işaret edebilir mi?

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

Ben doğru adres yeni init ile her zaman yazılır ediliyor gibi düzgün çalıştığını başka güvenen her şeyim. dizi

cevap

0

Bu an için benim için çok kirli bir çözümdür ... Birisi bana hala daha iyi bir çözüme doğru işaret edebilir.

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