簡體   English   中英

使用 MongoDB C# 驅動程序 2.0 添加元素或添加到數組

[英]Add element or add to array using MongoDB C# driver 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);

如果想要忽略重復項,您可以使用$addToSet ,它將創建或附加到數組中,將其視為一個集合。 如果你只是想讓它成為一個普通的普通數組,那么使用$push 如果您明確使用 $push 並出現錯誤,則不應該,這是一個單獨的問題; 請參閱官方文檔:“如果要更新的文檔中不存在該字段,則 $push 添加該值作為其元素的數組字段。”

如果 Favorities 數組可能為空,則必須在使用“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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM