【问题标题】:Recreating positional array operator with LINQ and MongoDb使用 LINQ 和 MongoDb 重新创建位置数组运算符
【发布时间】:2016-09-27 06:16:14
【问题描述】:

在 MongoDB 中,我有一个有效的更新查询:

db.posts.update(
  { 
    "_id" : ObjectId("..."),
    "Comments.Reference" : 123 
  },
  { 
    $push : 
    { 
      "Comments.$.Notes": { Text: "Some description here" } 
    }
  });

这会找到具有匹配 Id 的 Post 文档,并针对该数组中具有匹配引用的 Comments 对象,将一个新对象推送到其中的 Notes 数组中。

但是,由于我使用的是 C# 和驱动程序,我想看看是否可以使用 LINQ 创建它。

我失败的地方是创建一个更新查询,该查询转换为创建 $ 位置运算符。

IMongoUpdate update = Update<Post>.Push(t => t.Comments.First().Notes,
                                        BsonDocument.Parse("{ Text: \"Test\"}");

我把 First() 作为第一个猜测并让它编译,但是它抛出一个错误,说它不能序列化它。

是否可以重新创建它,或者我只需要恢复使用“Comments.$.Notes”的字符串查询来代替?

编辑:只是为了更新,这是可行的,但不提供类型安全:

IMongoUpdate update = Update.Push("Comments.$.Notes",
                                  BsonDocument.Parse("{ Text: \"Test\"}");

【问题讨论】:

  • 你能分享你的 Post 类的 C# 吗?我已经有一段时间没有使用 Mongo C# 驱动程序了,但如果可以的话,我会尽力提供帮助:)
  • 很好的发现!我认为这与马丁现在的答案一样好,但目前不受支持。想要将该评论推广为答案,我会将其标记为已接受?
  • 很高兴,谢谢! ...只是希望我有一个比“不支持”更好的答案

标签: c# linq mongodb mongodb-.net-driver


【解决方案1】:

已添加此功能:

https://jira.mongodb.org/browse/CSHARP-1046

直接从 jira 案例中复制:

Builders<Entity>.Update.Set(x => x.MyArray[-1].Value, 10);

将产生

{ $set: { "MyArray.$.Value", 10 } }

【讨论】:

    【解决方案2】:

    不幸的是,目前似乎不支持它:(

    https://jira.mongodb.org/browse/CSHARP-531

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 2017-01-15
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多