Mongoose 填充返回空数组
Posted
技术标签:
【中文标题】Mongoose 填充返回空数组【英文标题】:Mongoose populate returning empty array 【发布时间】:2016-12-04 03:16:06 【问题描述】:我正在尝试使用 mongoose 填充函数,但作为响应,我得到了空数组,我看到了多个关于此的帖子
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 模型中的数据保存得很好。
Merchant document
Package document
但如果我使用填充函数进行查询,则会返回一个空字符串
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"
],
【问题讨论】:
猫鼬的版本是多少? 我也有同样的问题,但我的模型看起来和你的一样。最后解决了什么问题?type
不是我的问题。
【参考方案1】:
确保 Merchant 架构中的 packages 数组包含字符串类型的 ObjectId(不是数字)。您可以通过以下方式确保这一点:
merchant.packages.map(r => r._id = r._id + ''; );
【讨论】:
【参考方案2】:因为Schema
上的packages
字段是一个数组,所以您也应该将其填充为一个数组。
试试
.populate([
path:'packages', model:Package
])
Package
是您的包模型的实例。
【讨论】:
【参考方案3】:在 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);
验证您的商家文档中是否存在针对包裹的 ObjectId 数组。
【讨论】:
我遇到了同样的问题。但我的模型使用的是type
而不是$type
。
@TheValyreanGroup 检查您的参考类型它应该与模型名称相同。【参考方案4】:
您可以尝试从findBbyId
中删除第二个参数:
Merchant
.findById( req.params.id)
.populate('packages')
.exec(function (err, merchant)
if (err)
next(err);
else
res.status(200).json(merchant);
);
【讨论】:
试过了,还是得到一个空数组以上是关于Mongoose 填充返回空数组的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose Populate Child ref 返回空数组