Найди и посчитай nodejs mongodb - PullRequest
0 голосов
/ 25 января 2020

У меня есть коллекция mongodb с данными, например,

{"test": "test1"} 
{"test": "test2"}
{"test": "test3"}

На уровне базы данных поиск выполняется без проблем:

db.collection.find({test: "test1"}).count();

Получает результат: 13

Однако с уровня nodejs, когда у меня есть:

    var counter = db.collection('collection').find({test: "test1"}).count();
    counter.forEach (function (doc, err) {
         assert.equal (null, err);
         resultArray.push (doc);
     }, function () {
         client.close ();
         console.log ("resultArray", resultArray);
     });

Результат: forEach не является функцией

Что я должен использовать, чтобы потом можно было отобразить это значение в E JS

С уважением

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Это потому, что ваш db.collection.find({test: "test1"}).count() возвращает число, так как вы видите, что вы получаете 13, так как это число, которое вы не можете сделать .forEach для него. Так как forEach будет работать только с массивами, что подразумевает итерацию каждого элемента в массиве для выполнения некоторой операции.

Пример: - [1,2,3].forEach(i => console.log(i)) будет протоколировать 1, 2, 3. Но если вы передадите что-либо, кроме массива, в .forEach, то вы получите ошибку именно того, что получаете.

Также вы можете изменить свой запрос и код, так что вы можете попробовать это:

db.collection('collection').count({ test: "test1" }, (err, counter) => {
    if (err) {/** return from here */ }
    assert.equal(null, err);
    console.log('Total no.of docs matched ::', counter)
    resultArray.push(counter); // What is this resultArray, anyway it has to be an array ?
}, function () {
    client.close();
    console.log("resultArray", resultArray);
});

На всякий случай, если вам нужны все документы и их количество, просто наберите .find():

db.collection('collection').find({ test: "test1" }).toArray((err, resp) => {
    if (err) {/** return from here */ }
    assert.equal(null, err);
    /** Here resp will be an array of objects or [] */
    if (resp.length) {
        resultArray.concat(resp)
        console.log('Total no.of docs matched ::', resp.length)
    }
    console.log('No docs found for given filter');
}, function () {
    client.close();
    console.log("resultArray", resultArray);
});
0 голосов
/ 25 января 2020

Похоже, что вы не ожидаете разрешения обещания, find возвращает курсор и не имеет функции forEach.

Изменение строки на это должно решить проблему:

var counter = await db.collection('collection').find({test: "test1"});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...