Возвращать уникальный документ по запросу Mon go IN - PullRequest
1 голос
/ 06 мая 2020

Я запрашиваю Collection с 350k + Documents. Я запрашиваю field, используя предложение IN, где IN представляет собой массив из 27k + полей.

На самом деле кажется, что это довольно быстро возвращается в Mongoose. Однако с некоторыми совпадениями каждого элемента в IN может быть связано несколько Documents. Я бы хотел, чтобы на каждое совпадение возвращался только 1 документ (отсортированный по другому полю). Возможно ли это?

Пример Допустим, у меня есть Collection Fruit.

[
 {type:'apple', price:10},{type:'apple', price:5},{type:'apple', price:3},
 {type:'orange', price:2},
 {type:'pear', price:12}, {type:'pear', price:2}
]

Итак, в настоящее время у меня есть

const types = ['apple', 'orange', 'pear'];

//Will return full example above
//Returns 12k Docs in real app but bc multiple Docs are returned per item in IN

Fruit.find({type: { $in: types }}, (err, results) => {
        if (err) return console.error(err);
        console.log(results);
});

Я бы хотел просто

 [
         {type:'apple', price:10}
         {type:'orange', price:2},
         {type:'pear', price:12}
    ]

Как я могу настроить свой запрос, чтобы сделать что-то вроде этого ? Спасибо! вернулся. Поэтому вместо всех документов, соответствующих типу, я получаю только 1 с самой высокой ценой.

1 Ответ

1 голос
/ 06 мая 2020

Вам нужно $ группа по type и использовать $ max , чтобы получить самые высокие цены:

db.collection.aggregate([
    {
        $match: { type: { $in: ['apple', 'orange', 'pear'] } }
    },
    {
        $group: {
            _id: "$type",
            price: { $max: "$price" }
        }
    },
    {
        $project: {
            type: "$_id",
            _id: 0,
            price: 1
        }
    }
])

Пн go Игровая площадка

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