具有不同 $set 对象的 MongoDb updateMany()

Ilk*_*aci 6 javascript database mongodb nosql node.js

我正在开发一个迁移功能,需要在特定时间间隔内检索足球比赛结果并更新 MongoDB 中这些比赛的现有投注文档。此代码将在一天中多次调用,我正在寻找有关计算性能

数据结构看起来像这样。

{
    "games": {
        "2324754": {
            "id": "2324754",
            "comp_id": "1005",
            "formatted_date": "14.03.2018",
            "localteam_name": "Barcelona",
            "localteam_score": "3",
            "visitorteam_name": "Chelsea",
            "visitorteam_score": "0"
        },
        "2324756": {
            "id": "2324756",
            "comp_id": "1005",
            "formatted_date": "14.03.2018",
            "localteam_name": "Be?ikta?",
            "localteam_score": "1",
            "visitorteam_name": "Bayern München",
            "visitorteam_score": "3",
        }
    },
    "bets": [
        {
            "_id": "5aa9535c6c4f437de713452a",
            "match_id": "2324756"
        },
        {
            "_id": "5aacf9605c41bc0b3db304fd",
            "match_id": "2324754"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

一种选择是迭代 bets 数组并调用findOneAndUpdate()单个下注文档。由于性能问题,对于具有 150-200 个元素的 bets 数组无法很好地工作。

问题是是否有可能通过updateMany()操作来实现这种迁移。使用给定的查询所有文档不是问题,match_id但是如何为updateMany()?

文档中的示例假设多个文档的所需字段使用相同的值进行更新。 https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/

更新:

另一种选择是创建一个 Bulk 操作并findOneAnUpdate()在 for 循环内进行。但我再次不确定这是否足够有效。任何人都可以确认这将是他最好的/唯一的选择吗?至少不会用多个更新请求加载 mongo 服务器。

https://docs.mongodb.com/manual/reference/method/Bulk.find.update/

var bulk = db.items.initializeUnorderedBulkOp();
//Iterate Bets
//findOneAnUpdate
bulk.execute();
Run Code Online (Sandbox Code Playgroud)