У меня есть функция, которая вызывает соединение с двумя из моих коллекций в моей базе данных, и она хранит ее в двух массивах, но я не могу получить к ней доступ - PullRequest
0 голосов
/ 03 мая 2019

Я установил соединение с двумя коллекциями и сохранил его в двух массивах, но не могу получить к нему доступ, потому что он асинхронный.

Кроме того, я хотел выполнить что-то вроде этого SELECT roll FROM student

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

, но реализация этого не работает, она просто выбирает все из коллекции.

Я пытался использовать async / await, но он не работал.

Я пытался реализовать async (модуль 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();    
});

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Было бы полезно узнать, как выглядят объекты, хранящиеся в базе данных, но я все равно постараюсь ответить на вопрос.

Есть 2 проблемы, которые я вижу.

  1. Вы не правильно запрашиваете
  2. Вам нужно работать с асинхронной природой JavaScript:)

1. Некорректная фильтрация монго

Вы, похоже, не предоставляете аргументы методу find в правильном порядке и на самом деле не говорите Монго, что нужно что-то фильтровать.

Первый аргумент метода mongodb find - это объект фильтра. Это должно правильно фильтровать:

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...
}
0 голосов
/ 03 мая 2019

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 []

        client.close();// # if this is database connect close?
    });
});

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

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...