我正在尝试使用mongoose populate函数,但作为回应我得到了空数组,我看过多篇关于此的帖子
var MerchantSchema = new mongoose.Schema({
packages: [{ $type: mongoose.Schema.Types.ObjectId, ref: 'Package'}]
},
{
typeKey: '$type',
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at'}
});
module.exports = mongoose.model('Merchant', MerchantSchema);
这是我对基本模型的架构定义。
var mongoose = require('mongoose');
var PackageSchema = new mongoose.Schema({
merchant_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Merchant' },
name: String,
original_price: Number,
discounted_price: Number
});
module.exports = mongoose.model('Package', PackageSchema);
这就是我指的模型。 Package模型和Merchant模型中的数据正在保存得很好。
但是如果我使用populate函数查询,我将返回一个空字符串
Merchant
.findById( req.params.id, 'packages')
.populate('packages')
.exec(function (err, merchant) {
if (err)
next(err);
else
res.status(200).json(merchant);
});
输出:
{
"_id": "579b3b2dc2e8d61c0ecd2731",
"packages": []
}
任何人都可以帮助我
更新:
好的事情真的很奇怪。如果我尝试使用merchant_id
填充Package文档,那么它正在运行,但不是相反。
Package
.find()
.populate('merchant_id')
.exec(function (err, packages) {
if(err)
next(err);
else
res.status(200).json(packages);
});
输出:
[
{
"_id": "579b3b51c2e8d61c0ecd2732",
"name": "Hair + Nails",
"original_price": 600,
"discounted_price": 400,
"merchant_id": {
"_id": "579b3b2dc2e8d61c0ecd2731",
"updated_at": "2016-07-29T11:17:37.474Z",
"created_at": "2016-07-29T11:17:01.216Z",
"name": "VLCC",
"logo_image": "http://vlccwellness.com/India/wp-content/uploads/2015/09/logo1.png?",
"cover_image": "http://image3.mouthshut.com/images/imagesp/925053993s.jpg?",
"__v": 1,
"tags": [],
"packages": [
"579b3b51c2e8d61c0ecd2732"
],
"work_hours": {
"opening_time": 1000,
"closing_time": 2100,
"holiday": "Sunday"
},
"information": {
"description": "Lorem Ipsum",
"gender": "Men",
"services": [
"Hair"
],
答案 0 :(得分:1)
在MerchantSchema中使用$ type的类型。
var MerchantSchema = new mongoose.Schema({
packages: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Package'}]
},
{
typeKey: '$type',
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at'}
});
module.exports = mongoose.model('Merchant', MerchantSchema);
验证Merchant文档中是否存在针对包的ObjectId数组。
答案 1 :(得分:0)
您可以尝试从findBbyId
中删除第二个参数:
Merchant
.findById( req.params.id)
.populate('packages')
.exec(function (err, merchant) {
if (err)
next(err);
else
res.status(200).json(merchant);
});
答案 2 :(得分:0)
好吧,因为packages
上的Schema
字段是一个数组,您应该将其填充为数组。
尝试
.populate([
{path:'packages', model:Package}
])
wher Package
是您的包模型的实例。
答案 3 :(得分:0)
确保Merchant架构中的packages数组包含string类型的ObjectIds(不是数字)。您可以通过以下方式确保这一点:
merchant.packages.map(r => { r._id = r._id + ''; });