2016-04-03 56 views
0

我使用mongodb c#驅動程序,並嘗試插入初始化數組時,該字段爲空,並推動時,數組已存在的地址(在這一階段,我只是假設如果地址字段不爲空,則存在數組)。mongodb c#推或插入如果字段爲空

我正在使用下面的方法,它返回的錯誤肯定的地址值爲空,因此保持覆蓋自己與一個新的數組。

任何人都可以指向正確的方式來查詢地址是否存在空值?

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

我確信所有其他工作正常,因爲每次使用新的init都會覆蓋正確的地址。陣列

回答

0

這是我目前非常骯髒的解決方法...希望有人仍然可以指向我一個更好的解決方案。

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; 
     } 
    } 
相關問題