javascript - 调用成功后如何进行后续的mongo调用

标签 javascript node.js mongodb

我有nodejs-mongo设置,数据库配置如下(此处仅显示一个条目)

{
 "filename":"type1.json","secs":72.4060092977,"platform":"mac","version":"1.3.0", "inputfile":"temp.mov"
},

这是我尝试复制的 mongo 命令

db.perfR.distinct("platform") *(输出:["mac", "win"])*

db.perfR.distinct("version",{"platform":"win"}) * (输出: ["1.3.0", "1.3.2"] ) *

db.perfR.find({"version":1.3.2,"platform":"win"},{"filename":1,"secs":1,"_id":0}) *(输出:[“文件名”:“type1.json”,“秒”:72.4060092977])*

所以我想做的是

for every platform 
for every version
    get filename
    get secs

这是我迄今为止编写的代码

function createPlatformDataSets(callback){                
var dbHost = "mongodb://mongo:27017/perfSample";
var mongodb = require('mongodb')

var platformDataSets = []
var platformq = "platform"
//get Instance of Mongoclient
var MongoClient = mongodb.MongoClient;

//Connecting to the Mongodb instance.
//Make sure your mongodb daemon mongod is running on port 27017 on localhost
MongoClient.connect(dbHost, function(err, db){
    if ( err ) throw err;
    //use the distinct() to retrive distinct platforms
    db.collection("perfR").distinct(platformq,function(err, platResultSet){
        if ( err ) throw err;
        var maxPlatCnt = platResultSet.length // 1
        if (maxPlatCnt == 0){
            console.log("Bad PlatfQ Query")
            callback(true)
        }
        var versionedPlatDataSet = 0
        for (p=0; p < platResultSet.length; p++){
            (function(index){
                var platform = platResultSet[index]
                var options = createOptions(platform);
                //Get Versions
                var versionq = "\"version\",{\"platform\":" + platform + "}"
                console.log("Versionq::"+versionq)
                var dataSets = [];
                //var versions = ["1.3.0", "1.3.2"]; // (select disctinct(version) from cpu where platform = plat)
                // Use distinct() to find distinct Versions
                db.collection("perfR").distinct(versionq,function(err, verResultSet){
                    if ( err ) throw err;
                    var maxVerCnt = verResultSet.length // 2
                    if (maxVerCnt == 0){
                        db.close()
                        console.log("Bad Versionq Query")
                        callback(true)
                        }
                    var dataSetResponseCnt = 0 
                    for ( v=0; v < verResultSet.length; v++){
                            (function(idx){
                                var dataq = "{platform:" + platform + ",version:" + version + "},{filename:1,secs:1,_id:0}"
                                // Use find() to find filename and secs for given version and platform 

                       db.collection("perfR").find(dataq,function(err, dataResultSet){
                                    if ( err ) throw err;
                                    if (dataResultSet.length == 0){
                                        console.log("Bad dataq Query")
                                        callback(true)
                                    }
                                    //do something with filename and secs
                                    dataSetResponseCnt++
                                    if (maxVerCnt == dataSetResponseCnt){
                                        var platformData = {"options":options, "labels":labels, "datasets":dataSets, "platform":platform}
                                        platformDataSets.push(platformData)
                                        if (versionedPlatDataSet == maxPlatCnt){
                                            db.close()
                                            callback(null,platformDataSets)
                                        }
                                    }
                                })
                            })(v)
                    }
                    versionedPlatDataSet++
            })(p)
        }
    }
}

在“1”处,我能够检索不同的平台

但在“2”时,我得到 verResultSet.length 为零。

有人可以指出我出了什么问题吗?

(PS:这是我遇到的第一个严重的 javascript 异步问题,所以请耐心等待我的代码。欢迎提出所有建议:) )

最佳答案

您可以使用Promises 。例如,您的代码将是这样的:

return loadPlatforms().then(function (res){
    res.map(function(platform){
        loadVersion(platform).then(...)
    }
})

关于javascript - 调用成功后如何进行后续的mongo调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40826655/

相关文章:

javascript - 如何解决异步函数中的 promise ?

javascript - 如何隐藏字符串中的文本

javascript - 如何将路由器/中间件添加到Features应用程序?

node.js - Sequelize.authenticate() 对 Docker 内部的 google cloud sql 连接不起作用(没有成功或错误响应)

javascript - Materialise 日期选择器不触发 ui

scala - MongoDB - 按引用排序或 'Foreign Key' (Liftweb, Scala)

python - 在 Jupyter Lab 笔记本中使用 PyMongo 不会关闭与 MongoDB 服务器的任何连接

javascript - 如何在angular js中读取JSON文件

javascript - 如何将绑定(bind)表达式作为文本传递到指令隔离范围?

mysql - 如何将流氓查询转换为Mysql?