无法更新pymongo中的数据
Unable to update data in pymongo
我有一个 JSON POST
用户每次都会发送给我的数据以从第三方获取一些数据 service.I 计划缓存数据基于scope id 这样我就不会在每次用户请求时都插入数据 something.Futhermore 我为每个用户保留一个时间戳 request.Below 是用户要访问的 POST
数据每次都发给我。
{
"scope_id": "user1",
"tool_id": "appdynamics",
"api_id": "get metrics",
"input_params": {"user": "myuser", "pwd": "mypwd", "acc_id": "myaccount", "app_id": "TestApp", "metric-path": "ars",
"time-range-type": "BEFORE_NOW", "duration-in-mins": 10},
"output_filters": {}
}
下面是处理数据插入的代码片段
def post(self):
data = ServiceAPI.parser.parse_args()
print("First data", data)
scope_id = data["scope_id"]
tool_id = data["tool_id"]
api_id = data["api_id"]
input_params = data["input_params"]
output_filter = data["output_filter"]
if all([scope_id, tool_id, api_id]) and all(input_params.values()):
check_id = [j for i in users.find({}) for j in i if j == scope_id]
if check_id and check_id[0] == scope_id:
users.update({scope_id: [tool_id, api_id, input_params]},
{scope_id: [tool_id, api_id, input_params],
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, upsert=True)
else:
users.insert_one(
{scope_id: [tool_id, api_id, input_params],
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S')})
如果用户请求与上次完全相同,则更新语句会很好用,但如果用户需要新信息,例如在 POST
请求 api_id = "get logs"
中,则创建新条目理想情况下,它应该用最新的数据更新用户的数据。
当用户第一次发出 POST
请求时,下面是存储在我的数据库中的数据
[{'user1': ['appdynamics', 'get metrics', {'pwd': 'mypwd', 'metric-path': 'ars', 'user': 'myuser', 'time-range-type': 'BEFORE_NOW', 'acc_id': 'myaccount', 'app_id': 'TestApp', 'duration-in-mins': 10}], 'timestamp': '2018-03-24 21:49:28', '_id': ObjectId('5ab67a901899db6d8a266558')}]
现在我再次发出相同的请求,它确保不会产生新的条目,因为它是由相同的 scope id
但是现在如果用户请求一些新信息,例如
{
"scope_id": "user1",
"tool_id": "appdynamics",
"api_id": "get logs",
"input_params": {"user": "myuser", "pwd": "mypwd", "acc_id": "myaccount", "app_id": "TestApp", "metric-path": "ars",
"time-range-type": "BEFORE_NOW", "duration-in-mins": 10},
"output_filters": {}
}
注意我已经更改了 "api_id": "get logs"
,它创建了一个新条目而不是仅仅修改我 database.Here 中的现有数据现在是数据
[{'user1': ['appdynamics', 'get metrics', {'pwd': 'mypwd', 'metric-path': 'ars', 'user': 'myuser', 'time-range-type': 'BEFORE_NOW', 'acc_id': 'myaccount', 'app_id': 'TestApp', 'duration-in-mins': 10}], 'timestamp': '2018-03-24 21:49:28', '_id': ObjectId('5ab67a901899db6d8a266558')}, {'user1': ['appdynamics', 'get logs', {'pwd': 'mypwd', 'metric-path': 'ars', 'user': 'myuser', 'time-range-type': 'BEFORE_NOW', 'acc_id': 'myaccount', 'app_id': 'TestApp', 'duration-in-mins': 10}], 'timestamp': '2018-03-24 21:55:29', '_id': ObjectId('5ab67bf9089b16e9e77037f4')}]
所以这里的更新似乎 fail.What 可能出错了?
注意:这是一个烧瓶应用,我建议不要深入implementation.I的细节,只需要根据[=更新给定的数据39=]scope id 每次用户发出请求,无论是同一个请求还是不同的请求。
您正在将 upsert=True 传递给 update()。 Upsert 告诉 MongoDB 如果找到匹配查询的文档则更新现有文档,否则插入新文档。 update() 的第一个参数是查询过滤器,用于查找要应用更新的文档。 api_id == "get logs" 的更新查询过滤器不匹配任何现有文档,因此正在创建新文档。
我有一个 JSON POST
用户每次都会发送给我的数据以从第三方获取一些数据 service.I 计划缓存数据基于scope id 这样我就不会在每次用户请求时都插入数据 something.Futhermore 我为每个用户保留一个时间戳 request.Below 是用户要访问的 POST
数据每次都发给我。
{
"scope_id": "user1",
"tool_id": "appdynamics",
"api_id": "get metrics",
"input_params": {"user": "myuser", "pwd": "mypwd", "acc_id": "myaccount", "app_id": "TestApp", "metric-path": "ars",
"time-range-type": "BEFORE_NOW", "duration-in-mins": 10},
"output_filters": {}
}
下面是处理数据插入的代码片段
def post(self):
data = ServiceAPI.parser.parse_args()
print("First data", data)
scope_id = data["scope_id"]
tool_id = data["tool_id"]
api_id = data["api_id"]
input_params = data["input_params"]
output_filter = data["output_filter"]
if all([scope_id, tool_id, api_id]) and all(input_params.values()):
check_id = [j for i in users.find({}) for j in i if j == scope_id]
if check_id and check_id[0] == scope_id:
users.update({scope_id: [tool_id, api_id, input_params]},
{scope_id: [tool_id, api_id, input_params],
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, upsert=True)
else:
users.insert_one(
{scope_id: [tool_id, api_id, input_params],
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S')})
如果用户请求与上次完全相同,则更新语句会很好用,但如果用户需要新信息,例如在 POST
请求 api_id = "get logs"
中,则创建新条目理想情况下,它应该用最新的数据更新用户的数据。
当用户第一次发出 POST
请求时,下面是存储在我的数据库中的数据
[{'user1': ['appdynamics', 'get metrics', {'pwd': 'mypwd', 'metric-path': 'ars', 'user': 'myuser', 'time-range-type': 'BEFORE_NOW', 'acc_id': 'myaccount', 'app_id': 'TestApp', 'duration-in-mins': 10}], 'timestamp': '2018-03-24 21:49:28', '_id': ObjectId('5ab67a901899db6d8a266558')}]
现在我再次发出相同的请求,它确保不会产生新的条目,因为它是由相同的 scope id
但是现在如果用户请求一些新信息,例如
{
"scope_id": "user1",
"tool_id": "appdynamics",
"api_id": "get logs",
"input_params": {"user": "myuser", "pwd": "mypwd", "acc_id": "myaccount", "app_id": "TestApp", "metric-path": "ars",
"time-range-type": "BEFORE_NOW", "duration-in-mins": 10},
"output_filters": {}
}
注意我已经更改了 "api_id": "get logs"
,它创建了一个新条目而不是仅仅修改我 database.Here 中的现有数据现在是数据
[{'user1': ['appdynamics', 'get metrics', {'pwd': 'mypwd', 'metric-path': 'ars', 'user': 'myuser', 'time-range-type': 'BEFORE_NOW', 'acc_id': 'myaccount', 'app_id': 'TestApp', 'duration-in-mins': 10}], 'timestamp': '2018-03-24 21:49:28', '_id': ObjectId('5ab67a901899db6d8a266558')}, {'user1': ['appdynamics', 'get logs', {'pwd': 'mypwd', 'metric-path': 'ars', 'user': 'myuser', 'time-range-type': 'BEFORE_NOW', 'acc_id': 'myaccount', 'app_id': 'TestApp', 'duration-in-mins': 10}], 'timestamp': '2018-03-24 21:55:29', '_id': ObjectId('5ab67bf9089b16e9e77037f4')}]
所以这里的更新似乎 fail.What 可能出错了?
注意:这是一个烧瓶应用,我建议不要深入implementation.I的细节,只需要根据[=更新给定的数据39=]scope id 每次用户发出请求,无论是同一个请求还是不同的请求。
您正在将 upsert=True 传递给 update()。 Upsert 告诉 MongoDB 如果找到匹配查询的文档则更新现有文档,否则插入新文档。 update() 的第一个参数是查询过滤器,用于查找要应用更新的文档。 api_id == "get logs" 的更新查询过滤器不匹配任何现有文档,因此正在创建新文档。