gpt4 book ai didi

javascript - 从 id 数组到名称数组(mongo、nodejs)

转载 作者:可可西里 更新时间:2023-11-01 09:57:01 26 4
gpt4 key购买 nike

我已经研究了好几个小时了...感谢您的帮助。

我有一个“用户”集合,每个用户都有一个 _id 和一些名称(UsernameFirstNameLastName)。我还有一个“Group”集合,每个组都有Members,这是一个用户的_id数组。

起初我想要一个简单的函数,它接收一个 id 数组并将其转换为一个格式良好的字符串数组:FirstName + ""+ LastName + "("+ Username + ")"。所以我为此做了一个简单的for:

    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 是异步的,因此无法正常工作。经过一番阅读,我安装了 async我认为这会解决我的问题。我试过异步,async.whilst , async.times甚至试图用 async.waterfall 破解某些东西- 但没有任何效果 - 几乎所有的结果都以相同的方式结束:在将字符串推送到数组之前传递数组。

也许我处理这个任务的方法是错误的?

最佳答案

如果您已经有用户 ID 数组,那么最好使用 map() 将该字符串数组转换为 ObjectId 数组。 方法,然后在 find() 中查询使用 $in 运算符选择字段值等于指定数组中的任何值的文档。

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

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

另一种方法是采用聚合路由,您可以在其中使用 $group 使用 $push 创建所需数组的管道步骤 $concat 运算符。

考虑运行以下聚合操作:

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

关于javascript - 从 id 数组到名称数组(mongo、nodejs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com