我有一个函数,该函数在数据库中调用到我的两个集合的连接,并将其存储在两个数组中,但是我无法访问它

我建立了与两个集合的连接,并将其存储在两个数组中,但是由于它的异步性,我无法访问它。


此外,我想执行类似SELECT SELECT FROM FROM Student的操作


db.student.find({},{roll:1,_id:0});


但实施此操作不起作用,只会从集合中获取所有内容。


我曾尝试使用async / await,但没有成功。


我尝试实现异步(npm模块)并使用了async.series方法,但没有起作用。


使用setTimeout来console.log记录值,但是我需要执行一些比较,因此没有帮助。


    let collectionOneArr = [];

    let collectionTwoArr = [];


    let db = client.db('job');


    db.collection('one').find({}, {field:1, name: 0}).toArray((err, data) => {

        data.forEach(val => collectionOneArr.push(val))

    });


    db.collection('two').find({}).toArray((err,data) => {

        data.forEach(val => collectionTwoArr.push(val))

    });


   console.log(collectionOneArr) // returns []

   console.log(collectionTwoArr) // returns []


//    setTimeout(() => console.log(collectionTwoArr, collectionOneArr), 1000);


    client.close();    

});


呼啦一阵风
浏览 106回答 1
1回答

杨魅力

了解存储在数据库中的对象的外观会有所帮助,但是无论如何我都会尝试回答这个问题。我可以看到2个问题。您查询不正确您需要使用javascript的异步特性:)1.错误的mongo过滤您似乎没有以find正确的顺序向方法提供参数,并且实际上并没有告诉mongo按任何内容进行过滤。mongodb find方法的第一个参数是过滤器对象。这应该正确过滤:db.collection('one').find({field:1, name: 0}).toArray((err,   data.forEach(val => collectionOneArr.push(val))});2.异步问题readyForCompute例如,我们可以使用一个标志来确保仅compute在两个数据库查询完成后才运行该方法。这是一个非常原始的解决方案,无法很好地扩展,但仅执行两个查询就足够了。let readyForCompute = false;let arr1 = [];let arr2 = [];let db = client.db('job');db.collection('one').find({name: "value_to_filter_name_field_by"}).toArray((err, data) => {    arr1 = data;    if (readyForCompute) compute();    readyForCompute = true;});db.collection('two').find({}).toArray((err,data) => {    arr2 = data;    if (readyForCompute) compute();    readyForCompute = true;});function compute() {    client.close();    console.log(arr1);    console.log(arr2);    // do your computation...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript