无法更新pymong中的数据

2024-06-16 12:20:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSONPOST数据,用户每次从第三方服务获取数据时都会发送给我,我计划基于作用域id缓存数据,这样就不会在用户每次请求时都插入数据什么。更进一步我为每个用户保留一个时间戳请求。在下面是用户正在使用的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')})

在这里,如果用户请求与上次完全相同,update语句就非常有效,但是如果用户需要一个新的信息(例如在POST请求api_id = "get logs"中),update语句就会生成一个新的条目,而理想情况下,update语句应该用最新的数据更新用户的数据。你知道吗

当用户第一次发出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')}]

现在我再次提出同样的请求,它确保没有新的条目,因为它是由相同的范围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",它生成了一个新条目,而不仅仅是修改我的数据库中的现有数据数据库。这里现在是数据吗

[{'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')}]

所以这里的更新似乎失败。什么可能出了问题?你知道吗

注意:这是一个flask应用程序,我建议不要讨论实现的细节。每次用户发出请求时,我只需要根据作用域id更新给定的数据,而不管它是相同的请求还是不同的请求。你知道吗


Tags: 数据用户inapiidinputdataget
1条回答
网友
1楼 · 发布于 2024-06-16 12:20:38

您正在将upsert=True传递给update()。Upsert告诉MongoDB更新现有文档,如果找到与查询匹配的文档,则插入新文档。update()的第一个参数是一个查询过滤器,用于查找要应用更新的文档。api\u id==“get logs”所在的更新查询筛选器与任何现有文档都不匹配,因此正在创建新文档。你知道吗

相关问题 更多 >