Mongoose deep populate не возвращает заполненный документ, который имеет ссылку на себя

#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. как вы заполняете цепочку дважды? Я уверен, что он не будет автоматически заполняться дважды. Я должен использовать самозаполнение раньше, но не функцию сборки.