我正在使用mongodb c#驱动程序并尝试在字段为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 :(得分: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;
}
}