Javascript 从ID数组到名称数组(mongo、nodejs)
这件事我已经查了好几个小时了。。。谢谢你的帮助 我有一个“用户”集合,每个用户都有一个Javascript 从ID数组到名称数组(mongo、nodejs),javascript,node.js,mongodb,asynchronous,async.js,Javascript,Node.js,Mongodb,Asynchronous,Async.js,这件事我已经查了好几个小时了。。。谢谢你的帮助 我有一个“用户”集合,每个用户都有一个\u id和一些名字(用户名,名字,姓氏)。 我还有一个“组”集合,每个组都有成员,这是一个用户id的数组 起初,我需要一个简单的函数来接收一个ID数组,并将其转换为一个格式良好的字符串数组:FirstName+“”+LastName+“(“+Username+”)。为此,我做了一个简单的: var ans = []; for (i=0; i<arrOfIds.length; i++) {
\u id
和一些名字(用户名
,名字
,姓氏
)。
我还有一个“组”集合,每个组都有成员
,这是一个用户id的数组
起初,我需要一个简单的函数来接收一个ID数组,并将其转换为一个格式良好的字符串数组:FirstName+“”+LastName+“(“+Username+”)
。为此,我做了一个简单的:
var ans = [];
for (i=0; i<arrOfIds.length; i++) {
users.find({"_id": ObjectID(arrOfIds[i])}, function(err, result){
ans.push = result.FirstName + result.LastName + "(" + result.Username + ")";
});
}
var ans=[];
对于(i=0;i),我认为这会解决我的问题。我尝试了异步,甚至尝试了用黑客攻击一些东西-但没有任何效果-几乎都以相同的方式结束:在字符串被推送到数组之前传递数组
可能我执行此任务的方法有误?您可以使用来通过单个查询查找多个用户。这既提高了性能,又减少了异步性带来的麻烦
// Convert the list of ids to mongo object ids
var objectIds = arrOfIds.map(function(item) {
return ObjectId(item);
});
// Use the $in operator to find multiple users by id
users.find({ "_id": { $in: objectIds } }, function(err, result) {
// result is now a list of users
});
如果您已经有一个用户ID数组,那么最好使用方法将该字符串数组转换为ObjectID数组,然后在查询中使用运算符选择字段值等于指定数组中任何值的文档
您需要调用光标上的方法,以便在数组中获得结果,进一步操作数组以返回所需结果,如下所示:
var MongoClient = require('mongodb').MongoClient,
ObjectID = require('mongodb').ObjectID;
MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {
// Get users collection
var Users = db.collection('users');
// Retrieve all the documents in the collection
Users.find({ "_id": { "$in": arrOfIds.map(ObjectID) } })
.toArray().then(function(users) {
// Create array of names
var ans = users.map(function (u){
return u.FirstName + " " + u.LastName + " (" + u.Username + ")";
});
// Do something with the result
console.log(ans);
db.close();
});
});
另一种方法是采用聚合路线,在该路线中,您可以使用管道步骤使用和操作符创建所需的数组
考虑运行以下聚合操作:
var MongoClient = require('mongodb').MongoClient,
ObjectID = require('mongodb').ObjectID;
MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {
// Get users collection
var Users = db.collection('users');
// Retrieve all the documents in the collection
Users.aggregate([
{ "$match": { "_id": { "$in": arrOfIds.map(ObjectID) } } },
{ "$group": {
"_id": null,
"users": {
"$push": {
"$concat": ["$FirstName", " ", "$LastName", " (", "$Username", ")"]
}
}
} }
]).toArray().then(results => {
const ans = results[0].users;
// Do something with the result
console.log(ans);
db.close();
});
});