#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
У меня простая настройка, подобная приведенной ниже:
const mongoose = require('mongoose');
const schema1Schema = new mongoose.Schema({
schema2Items: [
{
schema2Item: {
type: mongoose.Schema.Types.ObjectId,
ref: 'schema2s',
},
},
],
});
const schema2Schema = new mongoose.Schema({
name: {
type: String,
},
selfReferences: [
{
selfReference: {
type: mongoose.Schema.Types.ObjectId,
ref: 'schema2s',
},
},
],
});
module.exports = {
Schema1: mongoose.model('schema1s', schema1Schema),
Schema2: mongoose.model('schema2s', schema2Schema),
}
Запуск find
on Schema2
возвращает следующее,
const schema2Documents = await Schema2.find().select('-_id -__v')
[
{ name: 'schema2 One', "selfReferences": [] },
{ name: 'schema2 Two', "selfReferences": [
{ "name": 'schema2 Three', "selfReferences": [] },
{ "name": 'schema2 Four', "selfReferences": [] },
] },
{ name: 'schema2 Five', "selfReferences": [] },
]
Но если я запускаю find
or findOne
и populate
on Schema1
, он возвращает это:
const schema2ItemsInSchema1 = await Schema1.findOne().populate('schema2Items.schema2Item').select('-_id -__v')
{
"schema2Items": [
{
"schema2Item": {
"name": "schema2 One",
"selfReferences": []
}
},
{
"schema2Item": {
"name": "schema2 Two",
"selfReferences": [
{}, // <-- is not being populated
{} // <-- is also not being populated
]
}
},
{
"schema2Item": {
"name": "schema2 Five",
"selfReferences": []
}
}
]
}
Почему selfReferences
поле в schema2Items.schema2Item
path не заполняется? Ожидаемый результат должен быть,
const schema2ItemsInSchema1 = await Schema1.findOne().populate('schema2Items.schema2Item').select('-_id -__v')
{
"schema2Items": [
{
"schema2Item": {
"name": "schema2 One",
"selfReferences": []
}
},
{
"schema2Item": {
"name": "schema2 Two",
"selfReferences": [
{ "name": 'schema2 Three', "selfReferences": [] },
{ "name": 'schema2 Four', "selfReferences": [] },
]
}
},
{
"schema2Item": {
"name": "schema2 Five",
"selfReferences": []
}
}
]
}
Редактировать
Я пробовал следующее,
const schema2ItemsInSchema1 = await Schema1.findOne().populate({
path: 'schema2Items.schema2Item',
model: 'schema2s',
populate: { path: 'selfReferences', model: 'schema2s' },
}).select('-_id -__v')
Но все равно не повезло. Я также пробовал mongoose-autopopulate , и это тоже не сработало.
Комментарии:
1. Попробуйте запросить этот путь еще раз, дважды заполните.
2. Я пробовал это. Я также пробовал mongoose-autopopulate , и он все еще не работает.
3.
doc.populate(‘schema2items.schema2item.selfReference’).execPopulate()
после того, как вы его найдете.4. Все еще не работает
5. как вы заполняете цепочку дважды? Я уверен, что он не будет автоматически заполняться дважды. Я должен использовать самозаполнение раньше, но не функцию сборки.