Добавить массив в существующий массив Mongo - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь добавить больше массивов в существующий массив.

В настоящее время это выглядит так:

   "lastmsg" : ISODate("2020-01-27T07:23:03.601Z"),
    "_force_collection" : false,
    "metadata" : {
            "cwmpid" : "1804289383",
            "current_time" : "2020-01-27T08:23:02+00:00",
            "DSLInterface_parameter" : "WANDevice.1.",

У меня есть python скрипт, который использует update_one и $ set, но удаляет существующие данные в метаданных и добавляет то, что мне нужно, но я хочу сохранить уже существующие метаданные и добавить новые поля без перезаписи существующих данных.

Вот фрагмент кода сценария python:

            dict = {
                "metadata": {
                    "loc": {
                        "mark": row["metadata.loc.geo.bs.mark"],
                        "dslam": {
                            "locname": row["metadata.loc.geo.dslam.locname"],
                            "mark": row["metadata.loc.geo.dslam.mark"],
                            "devname": row["metadata.loc.geo.dslam.devname"],
                        },
                        "geo": {
                            "coordinates": [
                                float(
                                    row["metadata.loc.geo.coordinates.longitude"]
                                ),
                                float(row["metadata.loc.geo.coordinates.latitude"]),
                            ],
                            "type": row["metadata.loc.geo.type"],
                        },
                    }
                }
            }
            criteria = {"cpeid": cpeid}
            res = mycol.update_one(criteria, {"$set": dict})

После запуска он перезаписывает существующие данные, поэтому новый вывод выглядит так:

    "metadata" : {
            "loc" : {
                    "geo" : {
                            "type" : "Point",
                            "coordinates" : [
                                    16.4665492,
                                    43.5076267
                            ]
                    },
                    "dslam" : {
                            "locname" : "",
                            "devname" : "",
                            "mark" : "0"
                    },
                    "mark" : ""
            }
    }

}

Я пытаюсь получить следующее:

   "lastmsg" : ISODate("2020-01-27T07:23:03.601Z"),
    "_force_collection" : false,
    "metadata" : {
            "cwmpid" : "1804289383",
            "current_time" : "2020-01-27T08:23:02+00:00",
            "DSLInterface_parameter" : "WANDevice.1.",
            "loc" : {
                    "geo" : {
                            "type" : "Point",
                            "coordinates" : [
                                    16.4665492,
                                    43.5076267
                            ]
                    },
                    "dslam" : {
                            "locname" : "",
                            "devname" : "",
                            "mark" : "0"
                    },
                    "mark" : ""
            }
    }

}

@ whoami решение сработало, мне пришлось немного отредактировать решение для этого: {"$ set": {"metadata.lo c": dict}}

и удалить метаданные и lo c из dict!

...