首页 > 解决方案 > Mongoose Population 不工作只返回 [Object] 而不是字段

问题描述

嘿伙计们,我正在尝试使用mongoosefrom获取一些数据MongoDB

它甚至没有填充第一级。

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

我的文档结构如下:

架构[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

填写数据:

问题:

我正在尝试在我的文档中获取desc字段。DataUser

我尝试了什么:

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

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到 deep populate,它也像普通的猫鼬填充一样工作,根本没有效果。

这对我来说没有意义,为什么我什至无法DataType填充User:(

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

谢谢

标签: node.jsmongodbmongoosemongoose-schemamongoose-populate

解决方案


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

正如您所发现的,这确实是nested populationor的问题,但是您需要在填充时传递正确的,deep populationmodel

既然userData是一个_id集合DataType,那么model应该是DataType和不是User,同样data是一个_id集合Datamodel应该Data不是DataType。进行这些更改,它应该可以按预期工作。

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

尝试这个 :

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

此外,由于您也已Ref在模式中定义,因此您实际上不需要传入modelpopulate它会自动知道要从哪个集合填充。

下面的查询也应该工作:

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

希望这可以帮助!


推荐阅读