node.js - MongoDB - 使用 nodejs 驱动程序运行并行查询并在最后一个查询完成时关闭数据库连接

标签 node.js mongodb observable

我需要使用 node.js 驱动程序针对 MongoDB 并行运行多个查询。

目前我正在使用一个计数器,它会在查询完成时减少。当计数器达到 0 时,这意味着所有查询都已完成,然后我关闭数据库连接。

在并行运行 2 个查询的简单情况下,代码如下

var mongodb = require('mongodb');
var MongoClient = require('mongodb').MongoClient;
var db;

MongoClient.connect("mongodb://localhost:27017/company", function(err, database) {
    if(err) throw err;
    db = database;

    let collection = "resumes";
    let numberOfParallelQueries = 2;
    let result = [];
    let finalCallback = (err, resp) => {
        if (err) throw(err);
        numberOfParallelQueries = numberOfParallelQueries -1;
        result.push(resp);
        if (numberOfParallelQueries == 0) {
            console.log(result);
            db.close()
        };
    }
    db.collection(collection).find({"jobs": {$elemMatch: {"company": "CNA", position: "director"}}}).toArray(finalCallback);
    db.collection(collection).find({$and: [{"jobs.company": "CNA"}, {"jobs.position": "director"}]}).toArray(finalCallback);
});

我的问题是有没有更优雅的解决方案。我正在考虑 ObservableforkJoin() 方法行中的内容。

提前致谢

最佳答案

这就是Promises用于:

var mongodb = require('mongodb');
var MongoClient = require('mongodb').MongoClient;
var db;

MongoClient.connect("mongodb://localhost:27017/company", function(err, database) {
    if(err) throw err;
    db = database;

    let collection = "resumes";
    Promise.all([
        queryPromise(collection, {"jobs": {$elemMatch: {"company": "CNA", position: "director"}}}),
        queryPromise(collection, {$and: [{"jobs.company": "CNA"}, {"jobs.position": "director"}]})

    ]).then(function(result) {
        // result is an array of responses here
        db.close();
    }).catch(function(err) {
        console.log(err);
        db.close();
    });


    function queryPromise(collection, query) {
        return new Promise(function(resolve, reject) {
            db.collection(collection).find(query).toArray(function(err, resp) {
                if (err) {
                    reject(err);
                } else {
                    resolve(resp);
                }
            });
        })
    }
});

关于node.js - MongoDB - 使用 nodejs 驱动程序运行并行查询并在最后一个查询完成时关闭数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259122/

相关文章:

node.js - 引用Mongoose多个文档

MongoDB/RethinkDB 是否使用 ODM?

angular - 如何在客户端过滤 FirebaseListObservable?

javascript - 检查可观察对象是否完整

node.js - 尝试在 Node js 中初始化 Google Cloud api 时,无服务器失败

node.js - 如何从远程服务器下载一堆文件,并使用 Node.js 按特定顺序连接它们?

node.js - 如何使用 Lerna 和 Yarn 安装预发行包?

java - 如何在Java中的mongojack中使用elemmatch

angular - 将HttpHandler返回的Observable与HttpInterceptor中的另一个合并(Angular 8)

node.js - Node JS config.json 与 process.env 用于配置管理