从一个ID数组到一个名称数组(mongo,nodejs)

我一直在这个几个小时左右…感谢您的任何帮助。

我有一个“用户”集合,每个用户有一个_id和一些名字( Username名, FirstNameLastName )。 我也有一个“组”集合,每个组都有Members ,这是一组用户的_id

起初,我想要一个简单的函数,接收一个ID数组,并把它变成一个很好的格式的string数组: 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 + ")"; }); } 

但是因为mongo是asynchronous的,所以不起作用。 经过一番阅读,我安装了asynchronous ,我认为将解决我的问题。 我尝试了asynchronous,asynchronous,asynchronous,甚至试图用async.waterfall破解一些东西 – 但没有任何工作 – 几乎都以同样的方式结束:数组在string被推送之前被传递。

也许我对这个任务的做法是错误的?

如果你已经有了一个用户id的数组,那么最好的做法是用map()方法将这个string数组转换成一个ObjectIds数组,然后在find()查询中使用$in操作符来select文档字段的值等于指定数组中的任何值。

您需要在find()游标上调用toArray()方法,以便可以在数组中获得结果,进一步操作数组以返回所需的结果,如下所示:

 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(function(id){ return ObjectID(id); }) } }).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(); }); }); 

您可以使用$in操作符来查找具有单个查询的多个用户。 这对于性能来说是更好的,而且对于asynchronous性来说也不那么麻烦。

 // 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 });