Ограничить отдельные значения, только если существует подэлемент - PullRequest
0 голосов
/ 26 февраля 2019

Я искал здесь, но не смог найти четкого ответа на следующий вопрос.В приведенном ниже примере коллекции mycollection как выбрать отдельные vin числа только в объектах, где существует поле status и status равно UNLOCKED?

Я пытался

db.getCollection('mycollection').distinct("vin",  {$and: [{"decoded_payload.status": {$exists: true}}, {"decoded_payload.status":"UNLOCKED"}]})

, но этот запрос зависает бесконечно

Из-за большого размера базы данных и длительной задержки такого запроса я хотел быограничьте вывод, чтобы проверить, работает ли он вообще, но кажется, что limit() не вариант с .distinct()

. В MongoDB, как выбрать отдельные vin в данных ниже, установить ограничение= 1 и выбирается только на основе условия status (status существует и равно "UNLOCKED")?

Будет ли aggregate() правильным выбором?Как можно использовать вышеупомянутые условия с aggregate() и limit()?

Выходные данные в этом случае будут 34567

{
    "_id" : ObjectId("1"),
    "vin" : "12345",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329250,
        "status" : "LOCKED"
    }
}
{
    "_id" : ObjectId("2"),
    "vin" : "23456",
    "class_name" : "foo",
    "decoded_payload" : {
        "timestamp" : 1547329260,
        "status" : "LOCKED"
    }
}
{
    "_id" : ObjectId("3"),
    "vin" : "34567",
    "class_name" : "bar",
    "decoded_payload" : {
        "timestamp" : 1547329270,
        "status" : "UNLOCKED",
        "reservation_id" : "71"

    }
}
{
    "_id" : ObjectId("4"),
    "vin" : "45678",
    "class_name" : "baz",
    "decoded_payload" : {
        "timestamp" : 1547329280,
        "reservation_id" : "71"

    }
}    

1 Ответ

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

Вы можете использовать этот запрос агрегации для фильтрации данных и возврата различных "vin"

db.mycollection.aggregate([
    {
        $match: {
            $and: [{
                    "decoded_payload.status": { $exists: true }
                   }, {
                    "decoded_payload.status": "UNLOCKED"
            }]
        }
    },
    { $limit : 5 }, // You can use this stage after group too
    {
        $group: { _id: "$vin" }
    }
])

Использовать предельный уровень до и после $ group этап согласноТребование

...