node.js - Mongoose Population 不工作只返回 [Object] 而不是字段
问题描述
嘿伙计们,我正在尝试使用mongoose
from获取一些数据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
填写数据:
- 在用户 >
userData : ["dataTypeID" , "dataTypeID" ]
- 在数据类型 >
data : ["dataID" , "dataID" ]
- 在数据 >
desc: "pending"
问题:
我正在尝试在我的文档中获取desc
字段。Data
User
我尝试了什么:
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
:(
我希望有人能在这种奇怪的情况下帮助我。
谢谢
解决方案
您在第三次尝试中几乎朝着正确的方向前进,但是您提供了错误的模型来填充。
正如您所发现的,这确实是nested population
or的问题,但是您需要在填充时传递正确的,deep population
model
既然userData
是一个_id
集合DataType
,那么model
应该是DataType
和不是User
,同样data
是一个_id
集合Data
,model
应该Data
不是DataType
。进行这些更改,它应该可以按预期工作。
model
in.populate()
是告诉mongodb/mongoose
从哪个集合填充它。
尝试这个 :
await User.find().populate({
path: 'userData',
model: 'DataType',
populate: {
path: 'data',
model: 'Data',
}
}).lean();
此外,由于您也已Ref
在模式中定义,因此您实际上不需要传入model
,populate
它会自动知道要从哪个集合填充。
下面的查询也应该工作:
await User.find().populate({
path: 'userData',
populate: {
path: 'data'
}
}).lean();
希望这可以帮助!
推荐阅读
- openid-connect - 通过 /oauth/logout 的 Keycloak 网守注销不起作用
- javascript - 仅更新 Chart.js 不带动画且不刷新浏览器
- go - 如何获取命令的输出
- android - 如何用 Lottie 动画替换 SwipeRefreshLayout 加载动画
- python - 使用 SVM 缩放数据导致奇怪的混淆矩阵
- python - 如何获得每个图像属于一个类的概率
- mql4 - 如何在 MQL4 中创建 Web 服务客户端并解析结果?
- php - 按月分组并在 Laravel Eloquent 上排序日期
- r - 我可以在 R 中使用聚集函数匹配多列的“键”和“值”吗?
- python - 运气平衡问题解决方案产生错误的结果