使用PyMongo使用update_one执行UPSERT,同时还为每个文档添加/设置新字段

问题描述

我有一个python请求,以json格式返回api数据,如下所示:

[
 {
  'name': 'xyz','address': 'yyy'
 },{
  'name': 'abc','address': 'ccc'
 }
]

我想每天将这些数据加载到MongoDB中,无论是否对api json响应输出中的地址进行了任何更改,以及为每个每个文档插入/更新添加的datetimestamp字段> name 键输入json对象,如下所示:

 { 
  'id' : objectid(123456),'name': 'xyz','address': 'yyy'
  'dttm' : 2020-08-26:01:20:30'
 },{
  'id' : objectid(123457),'name': 'abc','address': 'ccc'
  'dttm' : 2020-08-26:01:20:30'
 }
 { 
  'id' : objectid(123458),'address': 'zzzzzzzzzzzzzzzzzzz'
  'dttm' : 2020-09-26:03:01:20'
 },{
  'id' : objectid(123459),'address': 'ccc'
  'dttm' : 2020-09-26:03:02:30'
 }

]

在上面的示例中-名称“ xyz”的地址与上次运行相比有所更改,但名称“ abc”没有更改,但仍使用不同的datetimestamp加载

示例代码

import requests
import json
from pymongo import MongoClient

url='xxx'
header={'Auth':'xyz','Content-Type': 'application/json'}
payload={}
api_data = requests.request("POST",url,data=json.dumps(payload),headers=header).json()

client = MongoClient('mongodb://localhost:27017') 
db = client[test_db][test_collection]

db.update_one({api_data},{$set:{dttm:datetime.today()}},{'upsert':True}) ##===>>what is the valid way to construct this using PyMongo ??

client.close()

解决方法

您可以在更新文档中提供时间戳,它将在插入和更新时将其写入数据库。

有关upsert的信息,请参见Fast or Bulk Upsert in pymongo