【问题标题】:Add element or add to array using MongoDB C# driver 2.0使用 MongoDB C# 驱动程序 2.0 添加元素或添加到数组
【发布时间】:2015-06-17 19:50:11
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

    • 如果数组元素不存在,这两种方法仍然会导致错误。我的问题是如果数组不存在,如何插入数组本身,然后将值插入该数组。
    • 如果数组不存在,这两个都应该创建数组;你的问题(现在我可以看到你的编辑)看起来是因为你试图基于字段 before 它存在。
    • 好的,有道理,但我还是不知道怎么写才能让它工作。
    • 对我来说听起来像是一个不同的问题。
    【解决方案2】:

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

    MongoDB.Driver.MongoWriteException: '写入操作导致错误。 无法将 $addToSet 应用于非数组字段。名为 'Favorites' 的字段具有非数组类型 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多