我有一个游戏网格,我试图将它放入一个包含多个块的行数组中。这些块存储在同一个集合中,并具有行和列字段。
我目前的尝试如下。
exports.findById = function(req,res) {
var id = req.params.id;
console.log('Retrieving game #' + id);
db.games.findOne( { "_id" : ObjectId(id) }, function(err, game_obj) {
if(err || !game_obj) {
console.log("no game");
res.send({'error':'An error has occurred'});
} else {
var rows = [];
function getRowBlocks(err,blocks) {
if(err || !blocks) {
console.log("no blocks");
res.send({'error':'An error has occurred'});
} else {
console.log(blocks[0].row + " has " + blocks.length + " blocks");
rows[blocks[0].row] = blocks;
}
}
for(i=0;i<game_obj.farthest_row;i++) {
db.blocks.find( { "game_id" : ObjectId(id), "row" : i }).sort( { "column" : 1 }).toArray(getRowBlocks);
}
res.send('game', { row_list : rows, game : game_obj});
}
});
}
但是由于对每一行调用的 mongodb find 操作的范围,我实际上无法获取存储在rows
变量中的块。而且因为有多个操作运行,我不能简单地将回调放在res.send...
里面。toArray
我只能使用一个查询并在回调中构建数组,然后将其传递,但考虑到多个查询是异步发生的并且可能有大量行,我认为这会降低效率。
如果我可以将 rows 数组传递给查询回调,我想我可以做到,但我无法确定这是否可能。