如何在MongoDb中简单执行更新/替换多个文档操作

9
这可能是您可以执行的最常见和基本的数据库操作之一。然而,在MongoDb中如何执行此操作仍不明确。
C#驱动程序中有一个UpdateManyAsync方法。但我能找到的只有像这样的示例;
以下操作将更新所有违规次数大于4的文档,并设置一个评论标志:
try {
   db.restaurant.updateMany(
      { violations: { $gt: 4 } },
      { $set: { "Review" : true } }
   );
} catch (e) {
   print(e);
}

坦白说,我不知道你们是如何构建应用程序的,但我们的组织绝不会将领域逻辑(例如多少违规构成审核)嵌入到数据库查询逻辑中,就像我找到的所有这种操作的示例一样。
看起来最好的选择是使用某种批量API,但对于这样一个简单的操作来说,似乎这是不必要的。让批量API执行一千个分别替换似乎对我来说效率低下,但我可能错了?
在其他存储技术和更成熟的API中,执行此操作所需的所有代码都是(例如Entity Framework);
db.UpdateRange(stocks);
await db.SaveChangesAsync();

这是否被追踪作为Mongo项目的功能请求?
1个回答

21

Bulk API 可以处理它,见下面的代码:

            var updates = new List<WriteModel<CosmosDoc>>();
            foreach (var doc in docs)
            {
                updates.Add(new ReplaceOneModel<CosmosDoc>(doc.Id, doc));
            }
            await MongoDb.DocsCollection.BulkWriteAsync(updates, new BulkWriteOptions() { IsOrdered = false });

它工作得很好 :) 非常感谢你 - Eren G.
这会解决在 Cosmos 中出现的“请求过多”问题吗? 我有一个用例,需要一次更新大量记录。以前我只是循环(现在看来很疯狂),当我们使用本地的mongo时还好,但在cosmos db上会抛出这些错误。 - punkologist

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