$ elemMatch с отличным - PullRequest
0 голосов
/ 05 июля 2018

У меня проблемы с разными запросами.

db.sessions.distinct("tests.device_serial")
[
        "",
        "5b34f4bf9854a",
        "5b34f4bf98664",
        "5b34f4bf98712",
        "5b34f4bf9876b",
        "5b34f4bf987c6"
]

Я не хочу получать результат с пустыми строками. Я пытался выполнить запрос:

 db.sessions.distinct("tests.device_serial", {"tests.device_serial" : {$ne: ""}})
[ ]

Почему я получил пустой массив? Где моя ошибка?

1 Ответ

0 голосов
/ 05 июля 2018

Угадай test.device_serial - массив, вот твоя ошибка:

 db.sessions.distinct("tests.device_serial", {"tests.device_serial" : {$ne: ""}})

Запрос в вашей отдельной команде фильтрует документы, где массив 'tests' содержит поле с именем device_serial со значением "", а не только поля в массиве.

Чтобы достичь того, что вы хотите, вы можете использовать структуру агрегации, разматывать массив для нескольких документов, фильтровать и группировать по нулю с помощью команды $ addToSet для получения различных значений.

Вот запрос:

db.sessions.aggregate(
    [
        {
            $unwind: {
                path : "$tests"
            }
        },
        {
            $match: {
            "tests.device_serial":{$ne:""}
            }
        },
        {
            $group: {
              "_id":null,
                "device_serials":{$addToSet:"$tests.device_serial"}
            }
        },
    ]
);
...