Выполняется ли функция mongoose populate () отдельно для каждого связанного документа

#node.js #mongodb #express #mongoose #mongoose-populate

#node.js #mongodb #выразить #mongoose #mongoose-populate

Вопрос:

У меня есть следующие модели.

Пользовательская модель

  • Имя
  • Адрес электронной почты

Модель категории

  • Имя
  • createdById (ссылается на пользовательскую модель)

Категория создается пользователем, и пользователь может иметь несколько категорий, созданных им / ею. Мой сценарий заключается в извлечении всех категорий с помощью объекта CreatedBy User внутри каждого документа категории.

 let categories = await CategoryModel.find({})
      .populate("createdById", "_id name email", "User")
      .exec();
 

Ожидаемый результат

 [
    {
        "_id": "5fb239eff11d915fb0f8f9ff",
        "name": "Vehicle",
        "createdById": {
            "_id": "53f439eff11f215fb0f8f94f",
            "name": "ABC Man",
            "email": "......"
        }
    },
    {
        "_id": "5fb239eff11d915fb0f8f1fh",
        "name": "Fruits",
        "createdById": {
            "_id": "53f439eff31f21efb0q8f94f",
            "name": "XYZ Man",
            "email": "......"
        }
    },
    {
        "_id": "5fb239effe4td915fb0f8f1fh",
        "name": "Vegetables",
        "createdById": {
            "_id": "53f439eff31f21efbf4af94f",
            "name": "BBC Man",
            "email": "......"
        }
    }
]
 

Итак, мой вопрос

  1. выполняет ли mongoose отдельно запрос для получения объекта createdById на каждой итерации документа категории
  2. или mongoose сначала сначала извлекает все документы категории, а затем извлекает значение свойства createdById из каждого документа категории и сохраняет в массиве. Затем выполняется массив для получения сведений обо всех пользователях одним запросом (с использованием оператора $in). Отображение пользователя обратно в документ каждой категории.

Комментарии:

1. Mongoose выполняет операцию локально, поэтому для выполнения заполнения он будет использовать несколько операторов $in . Это означает, что сначала будет выполнен запрос для получения вышеуказанных результатов, затем он выполнит другой запрос к вашей коллекции createdById, например, createdById.find({ id: { «$in»: [массив идентификаторов]}})

2. используйте mongoose.set(‘debug’, true), чтобы увидеть, что происходит за сценой.

3. Спасибо за быстрый ответ. Есть ли какой-либо способ узнать, как такая операция обрабатывает фон?

4. Спасибо @SomeoneSpecial. Вы правы. Пожалуйста, добавьте свой комментарий в раздел ответов, чтобы я мог отметить как ответ