如果field为null,mongodb c#push或insert

时间:2016-04-03 03:23:28

标签: c# mongodb mongodb-.net-driver

我正在使用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都会覆盖正确的地址。阵列

1 个答案:

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