【问题标题】:Mongoose .populate() only showing 1 documentMongoose .populate() 仅显示 1 个文档
【发布时间】:2013-01-23 08:39:57
【问题描述】:

我正在尝试仅将主队名称输出到页面,以便我可以尝试了解如何更好地使用我的代码。它只将一个团队打印到页面上,并将该团队的所有详细信息打印到页面上,而我只希望它打印一个部分。

这是我的代码,我希望它将每个 hometeam 的名称打印到页面上

  app.get('/home', function(req, res) {
    Match.findOne({}).populate('hometeam.name').exec(function(err, teams){
      util.log(teams);
      res.send(teams);
    });
  });

但是当我加载页面时,我得到的只是这个匹配列表中的第一条数据

[
  {
    "hometeam": "5106e7ef9afe3a430e000007",
    "_id": "5113b7ca71ec596125000005",
    "__v": 0,
    "key": 1360246730427
  },
  {
    "hometeam": "5113c13e0eea687b28000001",
    "_id": "5113e951354fe70330000001",
    "__v": 0,
    "key": 1360259409361
  },
  {
    "hometeam": "5113c13e0eea687b28000001",
    "_id": "5113e999354fe70330000002",
    "__v": 0,
    "key": 1360259481412
  }
]

另外,如果我尝试输入 util.log(teams.hometeam.name),我会得到以下信息:

TypeError: Cannot call method 'toString' of undefined

但我希望它能够在此处打印属于主队的名称。由于 hometeam 只是我数据库中 Team 的 objectId,我是否在此处缺少 DBreference 的某些内容?

更新:

团队架构

var Team = new Schema({
  'key' : {
    unique : true,
    type : Number,
    default: getId
  },
  'name' : { type : String,
              validate : [validatePresenceOf, 'Team name is required'],
              index : { unique : true }
            }
});

module.exports.Schema = Team;
module.exports.Model = mongoose.model('Team', Team);

匹配架构

var Team = require('../schemas/Team').Schema;

var Match = new Schema({
  'key' : {
    unique: true,
    type: Number,
    default: getId
  },
  'hometeam' : { type: Schema.ObjectId, ref: 'Team' },
  'awayteam' : { type: Schema.ObjectId, ref: 'Team' }
});

module.exports = mongoose.model('Match', Match);

【问题讨论】:

    标签: json mongodb mongoose


    【解决方案1】:

    Populate 采用您尝试检索的属性的属性名称。这意味着您应该使用“hometeam”而不是“hometeam.name”。但是,您想要检索团队的名称,以便可以对其进行过滤。然后调用将变为..

    Match.findOne({}).populate('hometeam', {name: 1}).exec(function(err, teams)
    

    现在您有一个名为“hometeam”的属性,其中包含该名称。玩得开心:)

    编辑

    展示如何在多个文件中拥有一个 mongoose 实例以正确注册模式。

    app.js

    var mongoose = require('mongoose');
    var Team = require('./schemas/team-schema')(mongoose);
    var Match = require('./schemas/match-schema')(mongoose);
    // You can only require them like this ONCE, afterwards FETCH them.
    var Team = mongoose.model('Team'); // LIKE THIS
    

    架构/match-schema.js

    module.exports = function(mongoose) {
        var Match = new mongoose.Schema({
            'key' : {
                unique: true,
                type: Number,
                default: getId
            },
            'hometeam' : { type: mongoose.Schema.ObjectId, ref: 'Team' },
            'awayteam' : { type: mongoose.Schema.ObjectId, ref: 'Team' }
        });
        return mongoose.model('Match', Match);
    };
    

    架构/team-schema.js

    module.exports = function(mongoose) {
        var Team = new mongoose.Schema({
            'key' : {
                unique : true,
                type : Number,
                default: getId
            },
            'name' : { type : String,
                validate : [validatePresenceOf, 'Team name is required'],
                index : { unique : true }
            }
        });
        return mongoose.model('Team', Team);
    };
    

    【讨论】:

    • 感谢您的回复。这在回复中给了我"hometeam": null,,但仍然只给了我一条数据。请查看原始帖子末尾的更新,我不确定为什么,但如果我尝试打印hometeam 的名称,我会收到该错误,hometeam 正在存储ObjectId 的Team存储在那里。那么我将如何检索 Team's 名称?
    • @germainelol 你介意用团队和比赛的方案更新你的问题吗?可能存在错误的引用(ref 变量)或指向的 ObjectId 不存在。我怀疑是前者,但两者都可能是个问题。
    • 方案很好,@germainelol。我可以想出另外两个选择来尝试。首先,确保主队的 ObjectId 确实有效(团队集合中文档的_id)。使用 MongoVUE 等工具进行确认。其次,确保在同一个 mongoose 实例中注册每个方案/模型。如果你再次 require('mongoose') ,两个 mongoose 实例都不知道彼此。后者可能更有可能是您遇到的问题。
    • 我已经检查了 id 以确认它确实是团队的 id。你能解释一下你在第二个建议中的意思吗?你的意思是我应该在匹配文件中需要团队架构/模型,在团队文件中需要匹配架构/模型?不要以为我跟着。
    • 每个架构都有一个文件。如果您在每个文件中包含 mongoose,您将获得两个 mongoose 实例。每个猫鼬实例都有一个模式(在那个文件中定义的那个),但不知道另一个模式。你应该有一个猫鼬实例。我将更新我的答案以举一个简短的例子。
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 2012-07-06
    • 2018-09-10
    • 1970-01-01
    • 2021-09-30
    • 2023-03-30
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多