当前位置:  开发笔记 > 编程语言 > 正文

从ID数组到名称数组(Mongo,NodeJS)

如何解决《从ID数组到名称数组(Mongo,NodeJS)》经验,为你挑选了1个好方法。

我已经为此花了几个小时...谢谢您的帮助。

我有一个“用户”集合,每个用户都有一个_id和一些名字(UsernameFirstNameLastName)。我也有一个“组”集合,每个组都有一个Members,它是用户数组_id

刚开始,我想要一个简单的函数,该函数接收一个id数组并将其转换为一个格式很好的字符串数组:FirstName + " " + LastName + " (" + Username + ")"。因此,我为此做了一个简单for的说明:

    var ans = [];
    for (i=0; i

但是由于mongo是异步的,所以没有用。经过一番阅读后,我安装了async,我认为它将解决我的问题。我只是尝试了async,async.whilst,async.times,甚至尝试用async.waterfall破解某些东西-但没有任何效果-几乎都以相同的方式结束了:在将字符串压入字符串之前传递了数组。

也许我对这个任务的态度是错误的?



1> chridam..:

如果您已经有一个用户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();
    });  
});

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有