【问题标题】:Updating database from a list of dictionaries从字典列表更新数据库
【发布时间】:2016-08-01 06:20:12
【问题描述】:

在 Python 中,我有一个字典列表。该列表称为members,每个成员都有一个唯一的id。例如,列表可能如下所示:

members = [{'id':1, 'val1':10, 'val2':11},
           {'id':2, 'val1':2, 'val2':34},
           {'id':3, 'val1':350, 'val2':9}]

我想用成员列表更新我的收藏,并根据需要更新和插入新条目。

我需要循环遍历成员,还是有更快的方法?

这是我的尝试,似乎可以做我想做的事,但需要一段时间:

for m in members: 
     collection.update_one( {'id':m['id']}, {'$set': m)}, upsert = True)

请注意,这需要使用不同的值更新每个数据库条目,即与其id 对应的值。

【问题讨论】:

  • 您可以通过 m['id'] 访问密钥。做 m.id 访问不存在的属性“id”。
  • @keksnicoh 是的,固定问题

标签: python mongodb mongodb-query pymongo upsert


【解决方案1】:

如果您有相同的值,请使用update_many

但是如果你有不同的值,你不能用一个 MongoDB 查询一次更新两个文档。您将始终必须在两个查询中执行此操作。您当然可以将字段的值设置为相同的值,或者以相同的数字递增,但您不能在 MongoDB 中使用相同的查询进行两次不同的更新。

【讨论】:

  • 我不知道如何将它应用到我的情况,我不仅要匹配x:1,还要匹配每个不同 id,并更新相应的数据库进入。
  • @Hatshepsut,使用 $or 指定不同的 id
  • 我添加了我所拥有的列表类型的示例。如果可能,您能否提供代码显示如何使用与每个唯一 id 对应的 val1val2 更新数据库?
【解决方案2】:

使用现代 pymongo,您可以在特定情况下将 .bulk_write()ReplaceOne 批量写入操作或其他适当的操作一起使用

from pymongo import MongoClient
from pymongo import ReplaceOne

client = MongoClient()

db = client.test

members = [
  { 'id': 1, 'val1': 10,  'val2': 11 },
  { 'id': 2, 'val1': 2,   'val2': 34 },
  { 'id': 3, 'val1': 350, 'val2': 9  }
]

db.testcol.bulk_write([
  ReplaceOne(
    { "id": m['id'] },
    m,
    upsert=True
  )
  for m in members
])

理想情况下,您不会从源“列表”进行处理,而是读取一些外部“流”以降低内存需求。以类似的方式,您只需为 1000 操作构建操作列表参数,然后每 1000 次调用 .bulk_write() 到服务器。

但重点在于,使用.bulk_write(),您将一次性发送所有“批次”,并且只有一个响应,而不是作为具有单独响应的单独请求,这会产生开销并需要时间。

同样使用此 API 方法实际上在支持的服务器中使用了下面的 "Bulk API",但当服务器版本不支持“批量”方法时,会降级为为您进行单独调用。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2022-01-16
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多