2016-04-03 17 views
0

mongodb C#ドライバを使用して、フィールドがnullの場合に初期化された配列を挿入しようとしています。 nullでない場合はアドレスフィールドに配列が存在します)。mongodb c#フィールドがnullの場合にプッシュまたは挿入

私は、アドレスの値がnullであることを偽陽性として返し、したがって新しい配列で自身を上書きし続ける以下のメソッドを使用しています。

アドレスにnull値が存在するかどうかを問い合わせる正しい方法を誰かが指摘できますか?

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; 
     } 
    } 
関連する問題