猫鼬种群无法正常返回 [Object],但不返回字段

Mongoose Population not working returning [Object] only not the fields

大家好,我正在尝试使用 mongooseMongoDB 获取一些数据。

它甚至没有填充第一级。

我会尽力解释下面的情况。

我的文件结构如下:

架构[s]

- UsersSchema

_id : { type: mongoose.Schema.Types.ObjectId },    
userData : [{ type: mongoose.Schema.Types.ObjectId, ref: 'DataType' }],


- DataTypeSchema

_id : { type: mongoose.Schema.Types.ObjectId },    
data : [{ type: mongoose.Schema.Types.ObjectId, ref:'Data' }],


- DataSchema

_id : { type: mongoose.Schema.Types.ObjectId },    
desc: String

正在填充数据:

问题:

我正在尝试在我的 User 文档中获取 Datadesc 字段。

我试过的:

1次尝试

await User.find().populate('userData').lean();

响应:它应该填充 DataType 模型。相反,我正在查看 [ [Object], [Object] ]

[{
    _id: 5b37aa4638a07505e809191a,
    userData: [ [Object], [Object] ],
    __v: 0
}]

2次尝试

await User.find().populate('userData.data').lean();

我试图做一些我不知道它会做什么的事情:D

响应:现在它 returns DataType 模型的 ID

[{
   _id: 5b37aa4638a07505e809191a,
    userData: [ 5b35577759407235a4293020, 5b355fb5f51a0c1de0a3ab3d ],
    __v: 0
}]

3次尝试

然后在阅读猫鼬文档后:

await User.find().populate({
  path: 'userData',
  model: 'User',
  populate: {
    path: 'data',
    model: 'DataType',
  }
}).lean();

响应:得到空数组userData : []

[{
 _id: 5b37aa4638a07505e809191a,
 userData: [ ],
 __v: 0
}]

注意 :如果我从第一个填充中删除 model: 'User' 我得到与 .populate('userData') = [ [Object], [Object] ],

相同的响应

在搜索答案后,我喜欢这个:mongoose-deep-populate 深入填充,它也像普通的猫鼬填充一样工作,根本没有效果。

我什至无法在 User 中填充 DataType :(

我希望有人能在这种奇怪的情况下帮助我。

谢谢

您在第三次尝试中几乎是朝着正确的方向前进,但是您提供了错误的填充模型。

这确实是nested populationdeep population的问题,正如你发现的,但你需要在填充时传递正确的model

因为 userDataDataType 集合的 _idmodel 应该是 DataType 而不是 User,类似地 dataData 集合的 _idmodel 应该是 Data 而不是 DataType。进行这些更改,它应该会按预期工作。

model in .populate() 是告诉 mongodb/mongoose 从哪个集合填充它。

试试这个:

await User.find().populate({
  path: 'userData',
  model: 'DataType',
  populate: {
    path: 'data',
    model: 'Data',
  }
}).lean();

此外,由于您在模式中也定义了 Ref,因此您实际上不需要在 populate 中传递 model,它会自动知道要传递给哪个集合填充自。

下面的查询也应该有效:

await User.find().populate({
  path: 'userData',
  populate: {
    path: 'data'
  }
}).lean();

希望对您有所帮助!