首页 > 解决方案 > MongoDB Motor - 无法使用变量 $push 到嵌套数组中

问题描述

我正在尝试更新我的 mongodb 文档中的嵌套数组,但我不知道如何$push在这样的嵌套数组中使用变量。文档说要使用点符号,但我不能使用它,因为我有不同的keynode_id我需要的$push

for key, value in docs.items():
    print(f'Key: {key} Value: {value}')
    for node_id, timestamp in value.items():
    result = await db[collection].update_one({'user_id': user_id, 'date': date}, {'$push':{"key.node_id": timestamp}}, upsert=True)
return result.modified_count

value是里面的嵌套字典docs。使用上面的代码只是用str 'key'和更新文档'node_id'。在这种情况下,如何使用点符号访问变量?

更新:

这是我正在尝试构建的示例文档

{
  "date": "18/04/2020",
  "user_id": "my_user",
  "standing": [
    { "2": [1582805181, 1582805183] },
    { "3": [1582805181, 1582805183] }
  ],
  "sitting": [
    { "2": [1582805181, 1582805183] },
    { "3": [1582805181, 1582805183] }
  ],
  "walking": [
    { "2": [1582805181, 1582805183] },
    { "3": [1582805181, 1582805183] }
  ]
}

更新 2:

key将是坐、站、走三种之一。value是文档中的嵌套字典,其键可以是 2 或 3 -node_id在这种情况下,timestamp它将是 10 位的 unix 时间戳。

标签: pythonmongodbpymongo

解决方案


您可以在$push使用变量的嵌套数组中使用更新运算符。变量值由提供key的值和node_id值构成。

以下两个变量:(i)cond_var与更新方法的查询条件一起使用,(ii)updt_var与更新一起使用。

cond_var = key + "." + node_id
updt_var = key + "." + "$" + "." + node_id

result = collection.update_one( { 'user_id': user_id, 'date': date, cond_var: { '$exists': True  } },  
                                { '$push': { updt_var : timestamp } },
                                upsert=True )

推荐阅读