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 填充返回的 ObjectId 和空数组

Mongoose 填充返回的 ObjectId 和空数组

猫鼬填充返回空数组

Mongoose Populate Child ref 返回空数组

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

Mongoose populate() 返回没有错误的空数组