Как вставить объект в объект в Mongodb - PullRequest
0 голосов
/ 04 апреля 2020

Итак, я 2 недели искал ответ на этот вопрос, но кажется, что это невозможно или я не знаю. Например, как вы знаете, в JSON вы можете сделать что-то вроде этого (упоминание части стримеров, в которую вы можете добавить столько объектов, сколько захотите, к другому объекту.):

data = {
    "name": "amirreza",
    "age": 24,
    "streamers": {
        "mine": False, "snipe": True
    }
} 

До этого я попытался использовать $ set, но он не работает так, как я хочу, он просто заменяет последний объект в списке:

list = ["test1", "test2", "test3", "test4"]
for i in list:
    s = status.find_one({"_id": 1})
    s2 = s["streamers"]
    if i in s2:
        print("y")
    elif not i in s2:
        status.update_one({"_id": 1}, {"$set": {"streamers": {i: False}}})

Теперь, что мне нужно здесь, это

data = {
    "name": "amirreza",
    "age": 24,
    "streamers": {
        "test1": False, "test2": False, "test3": False, "test4": False
    }
} 

Но это дает это:

data = {
    "name": "amirreza",
    "age": 24,
    "streamers": {
        "test4": False
    }
} 

1 Ответ

1 голос
/ 04 апреля 2020

status.update_one({"_id": 1}, {"$set": {"streamers": {i: False}}}) не должно быть в l oop. Зацикливаясь на s2, вы обновляете s2 для каждой итерации, поэтому для визуализации первая итерация устанавливает s2 на "streamers": { "test1": False}, вторая устанавливает s2 на "streamers": { "test2": False} и так далее ... до тех пор, пока дойдя до конца вашего списка, и последняя итерация устанавливает s2 в "streamers": { "test4": False}, вы получите этот результат, потому что так работает оператор $ set, он обновляет весь объект.

Вы близки к решению , Вы должны просто сконструировать объект, пройдя по s2, и, в конце концов, после того, как вы сделали объект, вы вышли из for для l oop, вы вызываете status.update_one({"_id": 1}, {"$set": {"streamers": YOUR_OBJECT}}). Таким образом вы обновите status с помощью всех стримеров, а не каждого стримера отдельно.

...