#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": "......"
}
}
]
Итак, мой вопрос
- выполняет ли mongoose отдельно запрос для получения объекта createdById на каждой итерации документа категории
- или mongoose сначала сначала извлекает все документы категории, а затем извлекает значение свойства createdById из каждого документа категории и сохраняет в массиве. Затем выполняется массив для получения сведений обо всех пользователях одним запросом (с использованием оператора $in). Отображение пользователя обратно в документ каждой категории.
Комментарии:
1. Mongoose выполняет операцию локально, поэтому для выполнения заполнения он будет использовать несколько операторов $in . Это означает, что сначала будет выполнен запрос для получения вышеуказанных результатов, затем он выполнит другой запрос к вашей коллекции createdById, например, createdById.find({ id: { «$in»: [массив идентификаторов]}})
2. используйте mongoose.set(‘debug’, true), чтобы увидеть, что происходит за сценой.
3. Спасибо за быстрый ответ. Есть ли какой-либо способ узнать, как такая операция обрабатывает фон?
4. Спасибо @SomeoneSpecial. Вы правы. Пожалуйста, добавьте свой комментарий в раздел ответов, чтобы я мог отметить как ответ