当前位置: 首页 > 知识库问答 >
问题:

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

嵇永望
2023-03-14

我建立了一个连接到两个集合并将其存储在两个数组中,但我无法访问它,因为它是异步的。

此外,我还想执行类似于从学生中选择滚动的操作

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

但实现这一点并不奏效,它只是从集合中获取所有内容。

我试过使用Async/Await,但它不起作用。

我尝试实现async(npm模块),并使用async.Series方法,但没有成功。

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

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

共有1个答案

农飞翔
2023-03-14

了解存储在数据库中的对象是什么样子会很有帮助,但无论如何,我将尝试回答这个问题。

有两个问题,我可以看到。

  1. 您没有正确查询
  2. 您需要使用JavaScript的异步特性:)

1.mongo过滤不正确

您似乎没有按照正确的顺序向find方法提供参数,实际上也没有告诉mongo根据任何内容进行筛选。

mongodb find方法的第一个参数是filter对象。这将正确地过滤:

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

2.异步问题

例如,我们可以使用readyforcompute标志来确保只在两个数据库查询完成后运行compute方法。这是一个非常原始的解决方案,不能很好地扩展,但仅足以执行2个查询。

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...
}
 类似资料:
  • 我有两个有效载荷,希望将它们合并为一个JSON对象(流连接)。在一些地方,人们建议使用AttributesToJSON,但由于其中一个JSON没有固定的属性集,我想这是不可能的。 第一个有效载荷是 第二个是, 我想要输出为

  • 我正在开发一个基于SAAS的站点,我必须将两个DBs中的两个表连接起来,比如说DB1中的table1和DB2中的table2。我必须使用cakephp中的join从表1和表2获取匹配记录,但它会抛出如下错误: 错误:SQLSTATE[42000]:语法错误或访问冲突:1142 SELECT命令拒绝用户'dbname'@'localhost'访问表'table_name'。 有谁能解释一下如何使用c

  • 问题内容: 我有2个表:product和cart,我希望结合这2个表并根据特定条件以数组形式显示数据,如下所示: 应显示特定类别下的所有产品,如果特定用户购买了给定产品中的任何产品,则其详细信息也应显示在该产品的前面 我到目前为止所做的代码是 它给出了这样的数组 但是我想要代替上面的数组的最后一个数组是 产品表视图(如您所见,产品表中包含一个productid,在每个productid下最多可以有

  • 问题内容: 我有两个非常大的表,我需要从这些表中处理一个小的结果集。但是,每个处理都是在几个函数中完成的,并且函数必须进行一些连接才能以正确的方式格式化数据。 我肯定需要以某种方式缓存初始结果集,以便功能可以重复使用它。我想做的是将第一个结果集放在一个集合中,将第二个结果集放在另一个集合中,然后通过SQL查询将这些集合当作真实的SQL表进行操作。 您能建议如何做到这一点吗? 问题答案: 您需要创建

  • ubuntu中没有/dev/net目录;我想创建一个tun设备。 这是我的dockerfile: 这是错误信息: 我想在/dev/net目录中创建一个tun文件

  • 问题内容: 我想加入两个(或更多)序列,然后创建一个元组序列。其中第一个元组将包含每个序列的第一个元素,第二个元组将包含第二个元素,以此类推…下面是一个示例函数,它接受两个数组并创建第三个元组数组。然后,我可以使用此序列来处理map(),filter()和reduce()函数。 我的示例有效,但缺乏很多方法。它不是用于所有序列的数组,当第一个序列用完元素时,它将停止生成元组。我希望nils出现在不