【问题标题】:Mongodb how to update many and set profile specific to idMongodb如何更新许多并设置特定于id的配置文件
【发布时间】:2019-09-19 20:17:38
【问题描述】:

我有一个名为 batch 的 id 列表,我想更新所有这些以将名为 fetched 的字段设置为 true。

原始测试集

[{
    "user_id": 1,
  },
  {
    "user_id": 2,
  }
]

批量变量

[1, 2]

UpdateMany

mongodb["test"].update_many({"user_id": {"$in": batch}}, {"$set": {"fetched": True}})

我可以使用上面的语句来做到这一点。

我还有另一个名为user_profiles 的变量,它是一个json 对象的列表/数组。我现在还想将字段 profile 设置为在列表(user_profiles)中找到的配置文件,其中 id 与我正在更新的 user_id/batch(id) 匹配。

user_profiles

[{

    "id": 1,
    "name": "john"

  },
  {
    "id": 2,
    "name": "jane"

  }
]

预期的最终结果

[{
    "user_id": 1,
    "fetched": true,
    "profile": {
      "id": 1,
      "name": "john"
    }
  },
  {
    "user_id": 2,
    "fetched": true,
    "profile": {
      "id": 2,
      "name": "jane"
    }
  }
]

我有数百万个这样的文档,所以我试图牢记性能。

【问题讨论】:

  • 单个$set 是不可能的。由于您在不同的文档中设置不同的值,因此您将需要多个查询。
  • @rdas :( 你知道为性能优化的最佳方法吗?我正在处理数百万个文档。
  • 按原样使用第一个查询。对于第二个配置文件部分,您可以尝试使用批量查询。

标签: python mongodb pymongo


【解决方案1】:

您需要使用db.collection.bulkWrite,请参阅updateOne example in the docs

如果您有数百万,您可能希望将 bulkWrites 批处理成更小的块,以便与您的数据库服务器的功能配合使用。

编辑: @Kay我刚刚重新阅读了我之前没有解决的问题的第二部分。您可能想尝试聚合管道的$out 阶段。不过要小心,因为它会覆盖现有的集合,所以如果你不投影所有字段,你可能会丢失数据。绝对值得首先使用临时集合进行测试。

最后,如果您并不绝对需要将数据物理存储在同一个集合中,您也可以基于聚合查询(使用 $lookup)创建一个 view

【讨论】:

  • updateOne 更新集合中与过滤器匹配的单个文档。如果多个文档匹配,updateOne 将仅更新第一个匹配的文档。我不认为这就是我需要的。我试图在这里匹配 id 以更新 id 所属的配置文件
  • @Kay 我没说updateOne,你仍然可以在bulkWrite 中使用updateMany,所以设置fetched 字段。您是否按照我提供的链接进行操作?我提供的第二个例子是updateMany
猜你喜欢
  • 2012-09-17
  • 2023-01-30
  • 2016-11-06
  • 2019-07-12
  • 2018-01-08
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多