Mongoose嵌入式文档查询返回null

时间:2012-08-13 12:57:35

标签: node.js mongodb mongoose

我有以下架构:

_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 ]
    }),

}

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

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

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

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

2 个答案:

答案 0 :(得分:2)

mongoose Model的findById方法用于查找该模型的实例,其中_id作为方法的第一个参数提供。因此Schedule.findById会返回Schedule个实例,而不是单个Game个实例。 Schedule.findOne({'game._id' : req.params._id}, ...将为您提供包含 Schedule的{​​{1}}实例,但如果您需要按ID查询Game个实例,应该将它们保存在单独的集合中,而不是将它们嵌入Game中。

答案 1 :(得分:0)

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

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

其次,根据我的理解,findById仅用于在这种情况下通过该ID查找Schedule。尝试使用普通的查找。

最后一想:你在{'game._id' : req.params._id}的末尾错过了一个结束的大括号。

希望有所帮助。 :)