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

问题描述 投票:0回答:2

我有一个文档,上面可以有一个“ Favorites”元素,我正在尝试将新值推入该元素的数组中。但是,出现错误,因为我要更新的文档没有“收藏夹”元素。如果不存在该如何创建元素,以便可以将新值推入其array属性?我可以一次操作吗?这是我在做什么,但出现错误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);
c# arrays mongodb mongodb-.net-driver mongodb-csharp-2.0
2个回答
0
投票

如果要忽略重复项,则可以使用$addToSet,它将创建或追加到数组中,将其视为一个集合。如果只希望它是一个普通驴普通数组,则使用$push。如果您显式地使用$ push并出现错误,则不应该这样做,那是一个单独的问题。请参阅官方文档:“如果文档中不存在要更新的字段,则$ push将使用值作为元素添加数组字段。”


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));
© www.soinside.com 2019 - 2024. All rights reserved.