Добавление в массив с двойным вложением в MongoDB - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть двойной вложенный массив в моей схеме MongoDB, и я пытаюсь добавить совершенно новый элемент массива во вложенный массив второго уровня, используя $ push.Я получаю сообщение об ошибке cannot use the part (...) to traverse the element

Документы имеют следующую структуру

{
    "_id" : ObjectId("5d8e37eb46c064790a28a467"),
    "org-name" : "Manchester University NHS Foundation Trust",
    "domain" : "mft.nhs.uk",
    "subdomains" : [ {
            "name" : "careers.mft.nhs.uk",
            "firstSeen" : "2017-10-06 11:32:00",
            "history" : [
                {
                    "a_rr" : "80.244.185.184",
                    "timestamp" : ISODate("2019-09-27T17:24:57.148Z"),
                    "asn" : 61323,
                    "asn_org" : "Ukfast.net Limited",
                    "city" : null,
                    "country" : "United Kingdom",
                    "shodan" : {
                        "ports" : [
                            {
                                "port" : 443,
                                "versions" : [
                                    "TLSv1",
                                    "-SSLv2",
                                    "-SSLv3",
                                    "TLSv1.1",
                                    "TLSv1.2",
                                    "-TLSv1.3"
                                ],
                                "cpe" : "cpe:/a:apache:http_server:2.4.18",
                                "product" : "Apache httpd"

                                    }
                                  ],
                                    "timestamp" : ISODate("2019-09-27T17:24:58.538Z")
                                }
                            }
                        ]

                    }
                ]
}

Я пытаюсь обновить данные, хранящиеся в массиве history, и добавитьеще одна запись массива, представляющая последние собранные данные для subdomain.name

. В результате у меня будет несколько записей в массиве history, каждая из которых помечает дату обновления данных.,Таким образом, у меня есть историческая запись об изменениях в любых хранящихся данных.

Я читал, что не могу использовать $ push для массива с двойным вложением, но все другие советы по использованию массив-фильтров все-такибыть связанным с обновлением записи в массиве, а не просто с добавлением совершенно нового документа - если я что-то упустил!

Я использую PyMongo и просто хотел бы создать новый словарь, содержащий все элементы данных, и просто добавить его в историю.

Спасибо!

1 Ответ

0 голосов
/ 28 сентября 2019

Прямо в пимонго:

record = db.mycollection.find_one()
record['subdomains'][0]['history'].append({'another': 'record'})
db.mycollection.replace_one({'_id': record['_id']}, record)
...