【问题标题】:Mongoose embedded document query returning nullMongoose 嵌入式文档查询返回 null
【发布时间】:2012-08-14 10:49:02
【问题描述】:

我有以下架构:

_schema : {

Prize : new Schema({
        prizeName : { type : String },
        thumbnailImage : [ String ],
        detailImage : [ String ],
        prizeCategory : [ {type : String, index : true } ],
        prizeDescription : { type : String },
        prizePrice : { type : Number, required : true }
    }),

Game : new Schema ({
        roomName : { type : String, required : true },
        openTime : { type : Date },
        closeTime : { type : Date },
        minPlayers : { type : Number },
        maxPlayers : { type : Number, required : true },
        numberOfPlayers : { type : Number },
        winner : { userId : { type : ObjectId, index : true, ref : 'User'} },
        prize : [ this.Prize ],
        tag : [ { type : String, index : true } ],
        status : { type : Number, index : true },
        businessType : { type : Number, required : true, index : true },
        mallId : { type : ObjectId, ref : 'Mall' },
        registeredPlayers : { type : ObjectId, ref : 'User' } 
    }),

Schedule : new Schema ({
        _id : ObjectId,
        time : { type : Date, index : true },
        game : [ this.Game ]
    }),

}

但是,当我尝试查询游戏嵌入文档时,该对象始终为空。我是这样查询的:

var Schedule = mongoose.model('Schedule', this._schema.Schedule);

Schedule.findById({'game._id' : req.params._id}).exec(function(err,gameDetail){...});

当我声明架构和模型时,我做错了什么吗?我见过很多例子,人们似乎在做我正在尝试的事情。任何帮助将不胜感激!提前致谢。

【问题讨论】:

  • 仍然没有任何运气。我想补充一点,我正在使用 Mongoose 3.0.0

标签: node.js mongodb mongoose


【解决方案1】:

猫鼬模型的findById 方法用于查找带有_id 的模型的实例,该_id 作为该方法的第一个参数提供。所以Schedule.findById 返回Schedule 实例,而不是单个Game 实例。 Schedule.findOne({'game._id' : req.params._id}, ... 将为您提供Schedule 实例包含具有该ID 的Game,但如果您需要通过ID 查询Game 实例,您应该将它们保存在单独的集合中而不是将它们嵌入Schedule

【讨论】:

  • 感谢 Johnny,我实际上已将 Games 移至另一个收藏夹。这解决了我遇到的问题。
【解决方案2】:

查看您的代码,我的第一个猜测实际上是您的 findById 结构不太正确。

首先,您使用值req.params._id 来获取ID。我见过的大多数代码示例以及我的代码在路由器(app.get('/schedules/:id'))中使用:id,这实际上意味着您要查找的ID 存储在req.params.id 中。您必须在您的代码中检查这一点。

其次,据我了解,findById 仅用于查找(在这种情况下)按该 ID 的计划。尝试仅使用普通查找。

最后的想法:您在{'game._id' : req.params._id} 末尾缺少一个右大括号。

希望能有所帮助。 :)

【讨论】:

  • 感谢您的回复。我在我的路线中写了:_id,并且正在使用console.log() 检查该值是否正确。我会试着找到并看看情况如何。
猜你喜欢
  • 2012-08-26
  • 2015-04-18
  • 2012-02-23
  • 2015-03-26
  • 2012-06-23
  • 2020-01-20
  • 2015-12-19
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多