Как поместить элемент в массив внутри объекта в базе данных MongoDB?

#python #database #mongodb #mongodb-query #pymongo

Вопрос:

Я новичок в MongoDB и пытаюсь понять, как поместить элемент в массив внутри объекта. Вот база данных:

 {
    "_id": {
        "$oid": "605cee2f08588cb6263c33a4"
    },
    "userID": "9346",
    "firstName": "James",
    "sessionsLog": {
        "date": [],
        "timestamp": [],
        "duration": []
    }
},
    {
    "_id": {
        "$oid": "605cee825ef711180adbc141"
    },
    "userID": "4778",
    "firstName": "Rob",
    "sessionsLog": {
        "date": [],
        "timestamp": [],
        "duration": []
    }
}
 

У меня есть дата, которую я хочу вставить в массив «дата» Роба: 3/30/2021.

Какова операция по введению этой новой даты в массив дат?

Это то, что я пробовал:

 import pymongo
myclient = pymongo.MongoClient("...")
mydb= myclient["myDatabase"]
users = mydb["Users"]

userID = '4778'
dateToPush = '3/30/2021'
allUsers = users.find({}, {'_id': 1, 'userID': 1, 'sessionsLog': 1})
for u in allUsers:
    if u.get('userID') == userID:
        users.update_one(
            {'userID': u.get('userID')},
            {'$push': {'sessionsLog'['date']: dateToPush}}
        )
 

Ответ №1:

https://docs.mongodb.com/manual/reference/operator/update/push/

Используйте . для вложенных объектов в вашем запросе.

Изменить

 '$push': {'sessionsLog'['date']: dateToPush}
 

Для

 '$push': {'sessionsLog.date': dateToPush}
 

Демо — https://mongoplayground.net/p/30GIvWkHDV1

 db.collection.update({
  "userID": "9346"
},
{
  $push: {
    "sessionsLog.date": { a: 1, b: 2 }
  }
})
 

Комментарии:

1. Также, вероятно, лучше иметь один массив с записями журнала вместо 3 массивов для 3 полей.

2. Работает отлично, именно то, что мне было нужно, спасибо.