Mongoose populate() 返回空数组

Posted

技术标签:

【中文标题】Mongoose populate() 返回空数组【英文标题】:Mongoose populate() returning empty array 【发布时间】:2015-08-16 11:51:37 【问题描述】:

所以我已经研究了 4 个小时,多次阅读文档,但仍然无法弄清楚我的问题。我正在尝试对我的模型做一个简单的 populate() 。 我有一个用户模型和商店模型。 User 有一个 favoriteStores 数组,其中包含商店的 _id。我正在寻找的是该数组将填充商店详细信息。

用户模型

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var UserSchema = new Schema(
      username: String,
      name: first: String, last: String,
      favoriteStores: [type: Schema.Types.ObjectId, ref: 'Store'],
      modifiedOn: type: Date, default: Date.now,
      createdOn: Date,
      lastLogin: Date
);

UserSchema.statics.getFavoriteStores = function (userId, callback) 
    this
    .findById(userId)
    .populate('favoriteStores')
    .exec(function (err, stores) 
        callback(err, stores);
    );

还有另一个文件:

商店模型

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var StoreSchema = new Schema(
  name: String,
  route: String,
  tagline: String,
  logo: String

);

module.exports = mongoose.model('Store', StoreSchema);

运行后我得到的是:


    "_id": "556dc40b44f14c0c252c5604",
    "username": "adiv.rulez",
    "__v": 0,
    "modifiedOn": "2015-06-02T14:56:11.074Z",
    "favoriteStores": [],
    "name": 
        "first": "Adiv",
        "last": "Ohayon"
    

FavoriteStores 是空的,即使我只是在没有填充的情况下获取商店,它确实显示了商店的 _id。

非常感谢任何帮助!谢谢;)

更新 使用deepPopulate plugin 后,它神奇地修复了它。我想问题出在 userSchema 的嵌套上。仍然不确定到底是什么问题,但至少已经解决了。

【问题讨论】:

在调用getFavoriteStores 函数之前,您是否在代码中的某个位置至少加载了一次“store.model”模块?如果没有,则 store 模型将不会注册到 mongoose 并且填充将失败。 @BrianShamblen 是的,我尝试添加 var Store = require('../store/store.model');在模型和控制器中。关于注册商店模型,我是否仍然遗漏了什么? 你使用的是哪个版本的猫鼬? @BrianShamblen "mongoose": "~3.8.8", 如果其他人有这个问题,你也应该尝试传递模型,就像在这个例子中一样: .populate( path: 'favoriteStores', model: 'Store' ); // 这为我解决了。 【参考方案1】:

我认为当跨多个文件定义架构时会发生此问题。要解决此问题,请尝试以这种方式致电populate

.populate(路径:'favoriteStores',模型:'Store')

【讨论】:

帮我解决了这个问题,你知道为什么会出现这个问题吗?我的意思是,如果查询是在数据库级别(对多个文件定义一无所知),为什么跨多个文件声明模型会引发这个问题?

以上是关于Mongoose populate() 返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose populate() 返回空数组

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

Mongoose Populate Child ref 返回空数组

mongoose#populate 在数组内的嵌套对象中返回 null

Mongoose .populate 随机

19-3-18 mongoose 连表查询populate用法