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符合这些规则的所有游戏,然后寻找特定玩家的游戏。