2

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

2 回答 2

0

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

于 2015-06-17T19:56:16.193 回答
0

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

MongoDB.Driver.MongoWriteException:'写入操作导致错误。无法将 $addToSet 应用于非数组字段。名为“收藏夹”的字段具有非数组类型 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));
于 2020-01-26T00:47:20.333 回答