Reputation: 165
I have the following schema :
_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 ]
}),
}
However when I try to query the game embedded document the object is always null. I'm querying like so:
var Schedule = mongoose.model('Schedule', this._schema.Schedule);
Schedule.findById({'game._id' : req.params._id}).exec(function(err,gameDetail){...});
Am I doing anything wrong when I declare the schema and models? I have seen numerous examples where people appear to be doing exactly what I'm trying. Any help would be greatly appreciated! Thanks in advance.
Upvotes: 0
Views: 683
Reputation: 311865
A mongoose Model's findById
method is used to find the instance of that Model with the _id
that's supplied as the first parameter to the method. So Schedule.findById
returns Schedule
instances, not individual Game
instances. Schedule.findOne({'game._id' : req.params._id}, ...
will get you the Schedule
instance containing the Game
with that id, but if you need to query for Game
instances by id, you should be keeping them in a separate collection instead of embedding them in Schedule
.
Upvotes: 2
Reputation: 5174
Looking at your code, my first guess is actually that your findById
isn't structured quite right.
First, you're using the value req.params._id
to get the id. Most of the code examples I have seen, and my code, uses :id
in the router (app.get('/schedules/:id')
), which would actually mean the ID you're looking for is stored in req.params.id
. You'll have to check that in your code.
Secondly, to my understanding, findById is only useful for finding, in this case, a Schedule by that ID. Try using just a normal find.
Last thought: you're missing a closing curly bracket at the end of {'game._id' : req.params._id}
.
Hopefully something in that helps. :)
Upvotes: 0