【问题标题】:MongoDB C# Driver - update all fields in embedded array of documentsMongoDB C# 驱动程序 - 更新嵌入式文档数组中的所有字段
【发布时间】:2020-02-17 10:51:52
【问题描述】:

我在数据库中有这个实体

{
    "_id" : ObjectId("XXX"),
    "Bets" : [ 
        {
            "IsPublic" : false
        }, 
        {
            "IsPublic" : false
        }
    ]
}

我想更新嵌套文档中的所有文件IsPublic。我有这个完美的查询:

db.getCollection('bets').update({"_id": ObjectId("XXX")}, {$set : { "Bets.$[].IsPublic" : true }})

我想用 C# 驱动程序编写相同的查询,我更喜欢强类型查询,如下所示:

var filter = Builders<TrackerBet>.Filter.Eq(b => b.Id, "XXX");
var update = Builders<TrackerBet>.Update.Set(b => b.Bets[-1].IsPublic, true);
var result = mongoDb.Bets.UpdateOneAsync(filter, update).Result; 

但它不起作用。如果我放弃强类型查询,它会起作用:

var update = Builders<TrackerBet>.Update.Set("Bets.$[].IsPublic", true); 

甚至可以实现强类型查询吗?我认为 b.Bets[-1].IsPublic 应该可以解决问题,但我收到错误 位置运算符没有从查询中找到所需的匹配项

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    我不知道使用官方驱动程序完成此操作的任何内置方法。我写了一个static utility class,它返回提供的 lambda 表达式的字符串路径。有了它,您可以像这样消除硬编码的字符串:

        var path = Prop.PosAll<TrackerBet>(t => t.Bets[0].IsPublic);
        var update = Builders<TrackerBet>.Update.Set(path, true);
    

    这里是more info,关于静态类的所有方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多