使用MongoDB C#驱动程序2.0添加元素或添加到数组

时间:2015-06-17 19:50:12

标签: c# arrays mongodb mongodb-.net-driver mongodb-csharp-2.0

我有一个文件可以有一个“收藏夹”元素,我正在尝试将一个新值推送到该元素的数组中。但是,我收到一个错误,因为我正在尝试更新的文档没有“收藏夹”元素。如果元素不存在,我如何创建元素,以便将新值推入其数组属性?我可以在一次手术中完成吗?这是我正在做的,但我收到错误cannot use the part (Favorites of Favorites.ProgramIds) to traverse the element ({Favorites: null})

var filter = Builders<UserEntity>.Filter.Eq(u => u.Id, userId);
var update = isFavorite ? Builders<UserEntity>.Update.AddToSet(u => u.Favorites.ProgramIds, id)
    : Builders<UserEntity>.Update.Pull(u => u.Favorites.ProgramIds, id);
await collection.UpdateOneAsync(filter, update);

2 个答案:

答案 0 :(得分:0)

如果要忽略重复项,可以使用$addToSet,它将创建或追加到数组中,将其视为一组。如果您只是想让它成为普通屁股普通数组,那么请使用$push。如果您明确使用$ push并获得错误,那么您就不应该这样做,这是一个单独的问题;请参阅官方文档:&#34;如果要更新的文档中缺少该字段,$ push会添加数组字段,并将值作为其元素。&#34;

答案 1 :(得分:0)

如果Favorities数组可能为null,则必须在使用“ addToSet”或“ push”之前创建该数组,否则会出现错误:

MongoDB.Driver.MongoWriteException:'写操作导致错误。 无法将$ addToSet应用于非数组字段。名为“收藏夹”的字段的非数组类型为null'

在下面的示例中,如果数组为null,则设置一个新数组

            var filter = Builders<UserEntity>.Filter.Eq(u => u.Id, userId);
            if (!isTheFavoritesArrayNotNull)
            {
                await collection.UpdateOneAsync(filter,
                    isFavorite ? Builders<UserEntity>.Update.Set(u => u.Favorites, new List<Favorite>()));
            }
            await collection.UpdateOneAsync(filter,
                    Builders<UserEntity>.Update.AddToSet(u => u.Favorites.ProgramIds, id));