Запросы вложенных документов MongoDB без соблюдения порядка ключей - PullRequest
0 голосов
/ 04 февраля 2019

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

db.getCollection('test').find({docId:'tLDmtdeYuG9DiGGrL',optimizeParams:{"deviceType":"mobile","daytime":"night"}})

Если я изменю порядок optimizeParams, я получу результат:

db.getCollection('test').find({docId:'tLDmtdeYuG9DiGGrL',optimizeParams:{"daytime":"night","deviceType":"mobile"}})

ТеперьSoultion будет использовать точечную запись, но в этом случае я получу ВСЕ документы, которые содержат оба ключа.Но мне нужны только документы, которые имеют ТОЛЬКО оба ключа (никаких других):

db.getCollection('test').find({docId:'tLDmtdeYuG9DiGGrL',"optimizeParams.deviceType":"mobile","optimizeParams.daytime":"night"})

Есть ли способ, как я могу выполнить запрос без соблюдения порядка ключей?

1 Ответ

0 голосов
/ 04 февраля 2019

Даже если бы был способ уважать их ключевые заказы, я бы порекомендовал его не использовать.Документы JSON предназначены для несоблюдения ключевых заказов.Вы должны проектировать свою схему с учетом этого.

Для вашего конкретного случая использования вы можете сделать это, если вы используете версию 3.6 или выше:

db.test.aggregate([{
    $match: {
        "optimizeParams.daytime": "night",
        "optimizeParams.deviceType": "mobile"
    },
},{
    $addFields: {
        count: {
            $size: {
                $objectToArray: "$optimizeParams"
            }
        }
    }
}, {
    $match: {
        count: 2
    }
}])

Этоответ помог мне с вышеуказанным решением.При использовании имейте в виду индексы.

Хотя это можно было бы сделать, «найти документы только с этими двумя ключами», по-видимому, не имеет значения с точки зрения любого приложения.В этой ситуации должно быть что-то значимое.Вы можете использовать другое поле, чтобы указать это значение, и использовать его для фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...