Прекращает ли выборка $ limit при совпадении одного результата? - PullRequest
1 голос
/ 25 апреля 2020

Я не совсем понимаю, что значит $ limit в совокупности. Я использую агрегат, потому что мне нужно заполнить свой элемент, но я не могу сделать это в findOne (не знаю почему, но он всегда ничего не возвращает).

return Item.aggregate(
    [
        { $match: { _id: mongoose.Types.ObjectId(id) } },
        { $limit: 1 },
        {
            $lookup: {
                from: 'variations',
                localField: '_id',
                foreignField: 'item',
                as: 'variations'
            }
        }
    ]
).then(result => { console.log(result) });

В этом случае выборка останавливается, когда совпадает один результат, или $ limit удерживает только один элемент от общего результата? Во втором случае, как я могу прекратить получать, когда элемент соответствует?

1 Ответ

3 голосов
/ 25 апреля 2020

$ limit используется для ограничения количества пропущенных элементов на следующем этапе в конвейере агрегации. скажем, ваша $ match stage выбрала записи на { status : 'active' }, и это произвело 1 миллион записей, и вам нужно только 10 лучших записей, переданных на следующий этап, или чтобы вернуть эти 10 записей клиенту, тогда вы добавите этап { $limit : 10 }.

но в вашем случае, поскольку вы сопоставляете по objectId, вам не нужен этап $ limit, потому что objectIds уникальны, и когда-либо будет только одна запись с этим Id. так что вы можете удалить его.

также вы не можете использовать интерфейс find для поиска, потому что он не позволяет вам выполнять соединения / поиски с другой коллекцией. Интерфейс find предназначен для непосредственного извлечения записей из одной коллекции. поэтому вам нужно использовать структуру агрегирования для сценария ios, такого как поиск.

...