2016-04-03 62 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; 
     } 
    } 
相关问题