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

Posted

技术标签:

【中文标题】Mongoose populate() 返回没有错误的空数组【英文标题】:Mongoose populate() returns empty array with no errors 【发布时间】:2016-12-24 14:37:55 【问题描述】:

我一直试图让这个填充的东西工作,但我遇到了问题,因为我没有得到预期的结果,也没有错误可以处理。只是一个空数组。

我的模型看起来像这样。每个人都有自己的文件

var mongoose = require('mongoose');

var upgradeSchema = new mongoose.Schema(
  type: 
    type: String,
    default: "Any"
  ,
  ability: String,
  ability_desc: String,
  level: Number,
  tag: String
);

mongoose.model('Upgrade', upgradeSchema);

和其他

var mongoose = require( 'mongoose' );
var crypto = require('crypto');
var jwt = require('jsonwebtoken');


var userSchema = new mongoose.Schema(
  email: 
    type: String,
    unique: true,
    required: true
  ,
  hero: 
    level: Number,
    name: String,
    type: 
      path: String,
      heroType: String
    ,
    upgrades: [
      type: mongoose.Schema.Types.ObjectId, ref: 'Upgrade'
    ],
    unspent_xp: Number,
    total_xp: Number,
  ,
  armyTotal: 
    type: Number,
    default: 0,
    max: 5000
  ,
  army:[
    foc_slot: String,
    unit_name: String,
    unit_cost: Number
  ],
  username: 
    type: String,
    required: true,
    unique: true,
  ,
  faction: String,
  name: 
    type: String,
    required: true
  ,
  hash: String,
  salt: String,
  roles: 
    type: String,
    default: 'player' 
);

我正在尝试这样做

module.exports.profileRead = function(req, res) 


    User
      .findById(req.payload._id)
      .populate('hero.upgrades')
      .exec(function (err, user) 
        if (err)
          console.log(err);
         else 
          res.status(200).json(user);
          console.log("success");
        
      );
    
;

这是一个用户的例子


    "_id" : ObjectId("57b4b56ea03757e12c94826e"),
    "hash" : "76",
    "salt" : "2",
    "hero" : 
        "upgrades" : [ 
            "57b42773f7cac42a21fb03f9"
        ],
        "total_xp" : 0,
        "unspent_xp" : 0,
        "type" : 
            "heroType" : "Psyker",
            "path" : ""
        ,
        "name" : "Jon Doe"
    ,
    "username" : "michaelzmyers",
    "faction" : "Grey Knights",
    "email" : "email@gmail.com",
    "name" : "Michael Myers",
    "roles" : "player",
    "army" : [],
    "armyTotal" : 625,
    "__v" : 3

现在,我尝试了一个仅包含 ObjectId 的字符串的数组,类似于示例,我也尝试过使用 ObjectId("STRINGHERE") 并且没有运气。它们都只返回一个空数组。但是,如果我摆脱 populate 调用(或将 populate 中的内容从 hero.upgrades 更改为只是 hero 或 upgrades),那么它只会返回一个字符串数组。我觉得问题在于填充以及我如何使用它。但是,当我在数据库中只进行一次升级(测试升级)时,一切正常。现在没有任何效果。有什么想法吗?如果需要,我很乐意提供更多代码。

【问题讨论】:

【参考方案1】:

在我的小研究中发现它会起作用:

User
  .findById(req.payload._id)
  .populate(
       path: 'hero.upgrades',
       model: 'Upgrade'
   )
  .exec(function (err, user) 
    if (err)
      console.log(err);
     else 
      res.status(200).json(user);
      console.log("success");
    
  );

看起来当用户将嵌套对象表示法(即hero.upgrades)赋予populate 方法时,Mongoose 在检测引用模型时遇到了问题。

【讨论】:

我怀疑这个问题是由跨多个文件定义模式引起的。

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

Model.populate() 不是 Mongoose 中的返回文档

Mongoose Populate 返回空数组

Mongoose Populate 返回空数组

Mongoose .populate 随机

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

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