我有一个带有childs引用的树结构,我想按id查找一个文档,并用无限嵌套的子级填充它。
我想要这个结果:
[
{
_id: '60e884adb73aa620d0583e602',
code: 'code1',
value: 'value_1002',
label: 'dechet_1002',
childrens: [
{
_id: '60e88489b73aa620d0583e5f3',
code: 'code1',
value: 'value_1001',
label: 'dechet_1001',
childrens: [
{
_id: '60e88444b73aa620d0583e5e5',
code: 'code1',
value: 'value_1000',
label: 'dechet_1000',
childrens: []
}
]
}
]
}
]
我尝试了预挂钩或中间件功能,但它对我不起作用:
// In the Model
const mySchema = new mongoose.Schema(
{
label: {
type: String,
required: true
},
//...
childrens: [
{
_id: {
type: ObjectId,
ref: 'patterns'
},
label: String,
//...
}
]
},
{ timestamps: true }
);
function autoPopulateChildrens(next) {
this.populate('childrens');
next();
}
mySchema
.pre('findOne', autoPopulateChildrens)
.pre('find', autoPopulateChildrens)
.pre('findById', autoPopulateChildrens);
const myModel = mongoose.model('patterns', mySchema);
module.exports = myModel;
// In the Controller
await myModel
.findOne({_id: pId})
.select('_id label childrens')
.populate('childrens');
findbyid和findone不适合我。我还尝试将我的 Mongoose 更新到最新版本。我使用的是“ Mongoose ”:“^5.9.27”。
我尝试使用此功能手动执行此操作:
const getDescendants = async (pId) => {
let descendants = [];
let array = [];
let item = await patternModel.findOne({ _id: pId });
let { _id, code, value, label, childrens } = item;
array.push({ _id, code, value, label, childrens });
while (array.length > 0) {
let currentnode = array.pop();
let children = await patternModel.find({
_id: { $in: currentnode.childrens }
});
children.forEach((child) => {
let { _id, code, value, label, childrens } = child;
descendants.push({ _id, code, value, label, childrens });
if (child.childrens.length > 0) {
array.push(child);
}
});
}
return descendants;
};
结果是:
[
{
"_id":"60e884adb73aa620d0583e60",
"code":"code1",
"value":"value_1002",
"label":"dechet_1002",
"childrens":[
{
"_id":"60e88489b73aa620d0583e5f",
"code":"code1",
"value":"value_1001",
"label":"dechet_1001"
}
]
},
{
"_id":"60e88489b73aa620d0583e5f",
"code":"code1",
"value":"value_1001",
"label":"dechet_1001",
"childrens":[
{
"_id":"60e88444b73aa620d0583e5e",
"code":"code1",
"value":"value_1000",
"label":"dechet_1000"
}
]
},
{
"_id":"60e88444b73aa620d0583e5e",
"code":"code1",
"value":"value_1000",
"label":"dechet_1000",
"childrens":[]
}
]
我想要的是:
[
{
_id: '60e884adb73aa620d0583e602',
code: 'code1',
value: 'value_1002',
label: 'dechet_1002',
childrens: [
{
_id: '60e88489b73aa620d0583e5f3',
code: 'code1',
value: 'value_1001',
label: 'dechet_1001',
childrens: [
{
_id: '60e88444b73aa620d0583e5e5',
code: 'code1',
value: 'value_1000',
label: 'dechet_1000',
childrens: []
}
]
}
]
}
]
暂无答案!
目前还没有任何答案,快来回答吧!