使用聚合管道在MongoDB C#驱动程序中更新文档

5

此处所述,从MongoDB 4.2开始,可以使用聚合管道更新文档。

这意味着现在可以表达“基于当前字段值的条件更新或使用另一个字段的值更新一个字段”。

例如:

db.members.update(
   { },
   [
      { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ], lastUpdate: "$$NOW" } },
      { $unset: [ "misc1", "misc2" ] }
   ],
   { multi: true }
)

我的问题是:我如何使用C#上的MongoDB来实现这一点?

1个回答

6

IMongoCollectionUpdateMany 方法的第二个参数是 UpdateDefinition<T>PipelineUpdateDefinition 是其派生类之一。目前还不支持表达式树,但可以利用 BsonDocument 类:

IMongoCollection<BsonDocument> col = ...;
var pipeline = new EmptyPipelineDefinition<BsonDocument>()
                    .AppendStage("{ $addFields : { " +
                                        "status : 'Modified'," +
                                        "comments: [ '$misc1', '$misc2' ]," +
                                        "lastUpdate: '$$NOW' " +
                                    "} }",
                        BsonDocumentSerializer.Instance)
                    .AppendStage("{ $project : { 'misc1':0, 'misc2':0 } }",
                    BsonDocumentSerializer.Instance);

col.UpdateMany(new BsonDocument(), pipeline);

执行以下命令(从MongoDB驱动程序跟踪):

"updates" : [
    { 
        "q" : { }, 
        "u" : [
            { "$addFields" : { "status" : "Modified", "comments" : ["$misc1", "$misc2"], "lastUpdate" : "$$NOW" } }, 
            { "$project" : { "misc1" : 0, "misc2" : 0 } }], 
        "multi" : true }
    }
]

太好了!谢谢你。 - Geraldo Neto
无法在最新的C#驱动程序中工作。到处都是编译错误 :( - Mathias Lykkegaard Lorenzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接