Запрос MongoDB со специальными символами в ключе - PullRequest
0 голосов
/ 17 апреля 2020

В моем случае в моей базе данных MongoDB есть ключи, в имени которых есть точка (см. Скриншот). Я прочитал, что таким образом можно хранить данные в MongoDB, но драйвер предотвращает запросы с точками в ключе. В любом случае, в моей базе данных MongoDB ключи содержат точки, и мне приходится работать с ними.

Я сейчас попытался закодировать точки в запросе (. To \ u002e), но, похоже, это не сработало. Затем у меня возникла идея поработать с регулярным выражением, чтобы заменить точки в запросе любым символом, но регулярное выражение, кажется, работает только для значения, а не для ключа.

У кого-нибудь есть творческое представление о том, как я могу получить вокруг этой проблемы? Например, я хочу иметь все номера CVE для 'cve_results.BusyBox 1.12.1'.

Обновление № 1: Структура cve_results выглядит следующим образом:

"cve_results" : {
            "BusyBox 1.12.1" : {
                "CVE-2018-1000500" : {
                    "score2" : "6.8",
                    "score3" : "8.1",
                    "cpe_version" : "N/A"
                },
                "CVE-2018-1000517" : {
                    "score2" : "7.5",
                    "score3" : "9.8",
                    "cpe_version" : "N/A"
                }
            }}

MongoDB data

Ответы [ 3 ]

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

Вы можете использовать оператор $ eq для запроса полей с точками в именах.

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

С помощью следующего обходного пути я смог получить прямой доступ к документам по их ключам, даже если в их ключе есть точка:

db.getCollection('mycollection').aggregate([
{$match: {mymapfield: {$type: "object" }}}, //filter objects with right field type
{$project: {mymapfield: { $objectToArray: "$mymapfield" }}}, //"unwind" map to array of {k: key, v: value} objects
{$match: {mymapfield: {k: "my.key.with.dot", v: "myvalue"}}} //query
])
0 голосов
/ 17 апреля 2020

Если возможно, возможно, стоит вставить документы, используя \u002e вместо точки, чтобы вы могли запросить их, сохранив значения ASCII . для любого клиентского рендеринга.

Тем не менее, кажется, что есть обходной путь для их запроса, например:

db.collection.aggregate({ 
    $match: {
        "BusyBox 1.12.1" : "<value>"
    }
})
...