mongoose – 通过对象

在node.js上使用mongoose我试图find所有的游戏玩家game.players.id等于我传递的ID。

架构:

var Game = mongoose.Schema({ id: String, date: { type: Date, default: Date.now }, game: Object, isOnline: Boolean }); 

我不知道这个函数有什么问题,但是它返回空数组:

 var specificGameStatistics = function (user, game) { var deferred = q.defer() Game.find({ "game.players.id" : user, "game.rules.gameType": game.gameType, "game.rules.quatro": game.quatro}, function(err, data) { deferred.resolve(data); }); return deferred.promise; } ////////////////////USAGE/////////////// var testGame = {rules: {gameType : 1, quatro : null}} UsersCtrl.specificGameStatistics(data.id, testGame).then(function(userData) { console.log(userData); }); 

这里是已经保存在数据库中的游戏的例子:

 { "isOnline" : true, "game" : { "numberOfPlayers" : NumberInt("1"), "players" : [ { "id" : "58a2c0ecd8ba9f8602836870", "name" : "PlayerName", "type" : NumberInt("1"), "avgStatistic" : "30.00", "numbersHit" : NumberInt("1"), "totalScore" : NumberInt("60"), .............................. } ], //there is more players here "rules" : { "gameType" : NumberInt("1"), "quatro" : null, "rounds" : NumberInt("1"), } // there is more in JSON object ............................... "_id" : ObjectId("58aed4aeea20ecdf0c426838"), "date" : ISODate("2017-02-23T13:25:18.284+01:00"), "__v" : NumberInt("0") } 

我已经testing了玩家ID是相等的,但它仍然返回空数组。 testing代码:

 ///////////TEST////////////// console.log(data.id, "58a2c0ecd8ba9f8602836870"); if (data.id === "58a2c0ecd8ba9f8602836870") {console.log("this is true");} var testGame = {rules: {gameType : 1, quatro : null}} UsersCtrl.specificGameStatistics(data.id, testGame).then(function(userData) { console.log(userData); }); //////////TEST/////////////// 

并返回:
58a2c0ecd8ba9f8602836870 58a2c0ecd8ba9f8602836870
这是真的
[]

————————————————– ————————————————– —-

答:在DeividasKaržinauskas的帮助下,解决scheme是:

 Game.where('game.players.id', user).where('game.rules.gameType', game.rules.gameType).find({}, function(err, data) { //, "game.rules.quatro": game.quatro deferred.resolve(data); }); 

这是因为你指定的附加规则( {gameType : 1, quatro : null} ),它不存在于播放器对象中

 { "id" : "58a2c0ecd8ba9f8602836870", "name" : "PlayerName", "type" : NumberInt("1"), "avgStatistic" : "30.00", "numbersHit" : NumberInt("1"), "totalScore" : NumberInt("60"), .............................. } 

)。 您可以通过简单地通过id来查找游戏来确认这一点。

如果你想添加这些规则,那么你应该find符合这些规则的所有游戏,然后寻找特定玩家的游戏。