不使用循环的多个 MongoDB 查询?
Multiple MongoDB queries without using a loop?
我正在尝试弄清楚是否可以让我的 MongoDB 查询(fron Node.js)更快更有效。
基本上我有一个"Players"的数组,每个Player有一个"player_id"属性。我想遍历每个玩家并使用 player_id 在 MongoDB 数据库中查找有关玩家的数据。
由于 Node.js 的异步性质,我必须保证当我向数据库发送查询时,我返回的数据对应于用于查询的 player_id .
到目前为止,我有以下代码(我已简化)。我最感兴趣的是如何在不使用 for 循环的情况下实现这一点。谢谢
var playersArray = new Array({"player_id":1234567}, {"player_id":9847621}, {"player_id":0946783}, {"player_id":8712890});
queryDataForPlayers(playersArray, function(data){
//Done - Each Player now has a "new_data_property" property
})
function queryDataForPlayers(playersArray){
var newPlayersArray = new Array();
var counter = 0;
for(var i=0; i<playersArray.length; i++)
{
retrievePlayerData(playersArray[i].player_id, playersArray[i], function(err,data)
{
newPlayersArray.push(data);
if(++counter == playersArray.length)
{
callback(newPlayersArray);
}//end if
});
}
}
var Schema = mongoose.model('Schema');
var ObjectID = require('mongodb').ObjectID;
function retrievePlayerData(playerID, obj, callback){
Schema.find({_id:ObjectID(String(playerID))}, function(err,data){
obj["new_data_property"] = data;
callback(err,obj);
});
}
我真的无法对此进行测试,但您可以将一组玩家 ID 直接传递给 mongo,并在一次查询中获取包含相关数据的文档集,例如
var playersArray = new Array({"player_id":1234567}, {"player_id":9847621}, {"player_id":0946783}, {"player_id":8712890});
var Schema = mongoose.model('Schema');
var ObjectID = require('mongodb').ObjectID;
function queryDataForPlayers(playersArray, callback){
var player_ids = playersArray.map(function(player) {
return ObjectID(String(player.player_id));
});
Schema.find({
'_id': { $in: player_ids}
}, function(err, docs){
callback(err, docs);
});
}
使用 $in 运算符...你可以像这样使用它
Schema.find({_id:{$in:[array_of_playerid]} }).exec(函数(错误,结果)){
}
我正在尝试弄清楚是否可以让我的 MongoDB 查询(fron Node.js)更快更有效。
基本上我有一个"Players"的数组,每个Player有一个"player_id"属性。我想遍历每个玩家并使用 player_id 在 MongoDB 数据库中查找有关玩家的数据。
由于 Node.js 的异步性质,我必须保证当我向数据库发送查询时,我返回的数据对应于用于查询的 player_id .
到目前为止,我有以下代码(我已简化)。我最感兴趣的是如何在不使用 for 循环的情况下实现这一点。谢谢
var playersArray = new Array({"player_id":1234567}, {"player_id":9847621}, {"player_id":0946783}, {"player_id":8712890});
queryDataForPlayers(playersArray, function(data){
//Done - Each Player now has a "new_data_property" property
})
function queryDataForPlayers(playersArray){
var newPlayersArray = new Array();
var counter = 0;
for(var i=0; i<playersArray.length; i++)
{
retrievePlayerData(playersArray[i].player_id, playersArray[i], function(err,data)
{
newPlayersArray.push(data);
if(++counter == playersArray.length)
{
callback(newPlayersArray);
}//end if
});
}
}
var Schema = mongoose.model('Schema');
var ObjectID = require('mongodb').ObjectID;
function retrievePlayerData(playerID, obj, callback){
Schema.find({_id:ObjectID(String(playerID))}, function(err,data){
obj["new_data_property"] = data;
callback(err,obj);
});
}
我真的无法对此进行测试,但您可以将一组玩家 ID 直接传递给 mongo,并在一次查询中获取包含相关数据的文档集,例如
var playersArray = new Array({"player_id":1234567}, {"player_id":9847621}, {"player_id":0946783}, {"player_id":8712890});
var Schema = mongoose.model('Schema');
var ObjectID = require('mongodb').ObjectID;
function queryDataForPlayers(playersArray, callback){
var player_ids = playersArray.map(function(player) {
return ObjectID(String(player.player_id));
});
Schema.find({
'_id': { $in: player_ids}
}, function(err, docs){
callback(err, docs);
});
}
使用 $in 运算符...你可以像这样使用它
Schema.find({_id:{$in:[array_of_playerid]} }).exec(函数(错误,结果)){ }