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

本文关键字:添加 元素 数组 MongoDB 驱动程序 使用 | 更新日期: 2023-09-27 17:56:53

我有一个文档,上面可以有一个"收藏夹"元素,我正在尝试将一个新值推入该元素上的数组中。但是,我收到错误,因为我尝试更新的文档没有"收藏夹"元素。如果元素不存在,如何创建元素,以便将新值推送到它的数组属性中?我可以在一次操作中完成吗?这是我正在做的事情,但我得到错误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);

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

如果希望忽略重复项,可以使用$addToSet,它将创建或附加到数组中,将其视为一个集合。如果你只是想让它成为一个正常的正常数组,那么使用 $push。如果您显式使用 $push 并收到错误,则不应这样做,这是一个单独的问题;请参阅官方文档:"如果文档中没有要更新的字段,$push添加数组字段,并将值作为其元素。

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

MongoDB.Driver.MongoWriteException:"写入操作导致错误。 无法将$addToSet应用于非数组字段。名为"收藏夹"的字段具有非数组类型空

下面是一个示例,如果数组为空,则设置一个新数组

            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));