Как я могу получить (Node.js) документы MongoDB с отличным значением, где какое-то другое значение является самым низким?

У меня есть такая коллекция:

{
    name : 'a',
    value: 10,
    word : 'baz'
},
{
    name : 'a',
    value: 65,
    word : 'bar'
},
{
    name : 'a',
    value: 3,
    word : 'foo'
},
{
    name : 'b',
    value: 110,
    word : 'bar'
},
{
    name : 'b',
    value: 256,
    word : 'baz'
}

Как выполнить запрос, который приводит к выбору полных документов, где name уникален, и value самый низкий? Например:

{
    name : 'a',
    value: 3,
    word : 'foo'
},
{
    name : 'b',
    value: 110,
    word : 'bar'
}

1 ответ

Решение

Вы могли бы использовать $min оператор в aggregation framework чтобы достичь того, что вы хотите, используя запрос, как:

db.collection.aggregate([
    {$group:{_id:"$name", value:{$min:"$value"}}}, 
    {$limit:2}
])

Этот запрос вернет:

{
        "result" : [
                {
                        "_id" : "b",
                        "value" : 110
                },
                {
                        "_id" : "a",
                        "value" : 3
                }
        ],
        "ok" : 1
}

Вы также можете включить $sortфаза в конвейере, если вы хотите, чтобы ваши результаты были отсортированы.

РЕДАКТИРОВАТЬ: Вы можете выбрать другие элементы, не включенные в поле _id $group, используя небольшой трюк. Сначала отсортируйте документы, а затем используйте $first оператор:

db.collection.aggregate([
    {$sort:{value:1}},
    {$group:{_id:"$name", value:{$min:"$value"}, word:{$first:"$word"}}} 
])

Этот запрос вернет:

{
        "result" : [
                {
                        "_id" : "b",
                        "value" : 110,
                        "word" : "bar"
                },
                {
                        "_id" : "a",
                        "value" : 3,
                        "word" : "foo"
                }
        ],
        "ok" : 1
}
Другие вопросы по тегам