Как вы можете использовать курсор на вложенном объекте, который сначала должен быть заполнен? - PullRequest
0 голосов
/ 11 апреля 2019

Скажите, что есть две схемы: User и Order.Схема User имеет атрибут Orders, представляющий собой массив Order идентификаторов объектов, таких как:

Orders: [{
   ref: 'Order',
   type: mongoose.Schema.Types.ObjectId
}]

Как выполнить итерацию по заполненному пользователю Orders с курсором?В идеале я ищу что-то вроде этого:

User.find({ _id: userID }).
    .cursor('Orders')
    .eachAsync(async (order) => {
           // Do something with each order
    });

Я хочу использовать курсор, потому что все ордера не помещаются в памяти.

Альтернатива # 2, которую я рассмотрел:

const user = await User.findById(userID);
Order.find({ _id: $in: user.Orders }).cursor().eachAsync(...);

Альтернатива № 3, которую я рассмотрел: Добавьте поле UserID в схему Order и сделайте что-то вроде этого:

const user = await User.findById(userID);
Order.find({ UserID: user._id }).cursor().eachAsync(...);

Я просто ищу самый эффективный способ выполнения этих типов запросов.

1 Ответ

0 голосов
/ 12 апреля 2019

все зависит от размера заказов

  1. если вы ожидаете, что десятки заказов # 1 будут достаточно эффективными,
  2. если больше этого # 2 будет более эффективный подход при условии Поле UserID в заказах индексируется, в этом случае у вас нет хранить отдельные заказы в массиве Orders объекта User.

Смотрите хорошее объяснение ваших вариантов здесь

В качестве альтернативы вы можете использовать структуру агрегации и делать все это за одну операцию, но она не будет более эффективной, чем # 2 или # 3, если вы не хотите возвращать заказы нескольких пользователей.

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