MongoDB Motor - Невозможно $ pu sh во вложенный массив, используя переменные - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь обновить вложенный массив в моем документе mongodb, и я не могу понять, как $push использовать переменные в таком вложенном массиве. документы говорят, что используют точечную запись, но я не могу использовать это, так как у меня есть различные key и node_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 будет unix отметкой времени из 10 цифр.

1 Ответ

0 голосов
/ 21 апреля 2020

Вы можете использовать оператор обновления $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 )
...