Получение общего количества документов в базе данных mLab с использованием mongoose и node.js - PullRequest
0 голосов
/ 05 мая 2018

UPDATE

После некоторого тестирования это работает:

Url.count({}, (err, data) => {
    console.log(data); // prints correct number
  });

Но это не так:

let len;
Url.count({}, (err, data) => {
  len = data;
});
console.log(len); // prints undefined

Есть ли способ получить данные о длине и затем использовать их в последующих операциях?

КОНЕЦ ОБНОВЛЕНИЯ

Я начинающий с Node и Mongoose. Как я могу получить общее количество документов в моей коллекции базы данных (которая называется "Url")?

Код, который я пробовал:

1

let len = Url.count();

2

let len = Url.count({});

3.

let len = Url.find().count();

4

let len = Url.find().count({});

5

let len = function(done) {
    Url.count({}, (err, data) => {
      if (err) { done(err) }
      else { done(null, data) }
    });
};

Я хочу вернуть число, но когда я console.log(len), я получаю огромный объект, который продолжается для строк и строк: enter image description here

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Я тоже с этим боролся. Асинхронный дизайн Javascript здесь. Console.log() даже до завершения запроса выполняет обратный вызов.

Итак, вы можете сделать это:

let len;
Url.count({}, (err, data) => {
  len = data;
  console.log(len);
});

Или оберните все это в функцию async:

// Just in case :)
mongoose.Promise = global.Promise;

async function dbOperations() {
  let len;
  // Ideally, you must also include error catching.
  // I am not, for now.
  len = await Url.count({}).exec();
  console.log(len);
}
dbOperations();

Пожалуйста, дайте мне знать, если это работает.

0 голосов
/ 06 мая 2018

Это связано с порядком выполняемых операций. Сначала это происходит

let len;

тогда

Url.count({}, (err, data) => {
// Nothing is happening in here yet, still waiting to finish counting
});

тогда

console.log(len); // So len IS undefined here. 

Наконец, как только он закончил считать:

len = data;

К счастью, мангусты могут помочь вам, поскольку они поддерживают .then

const numberOfUrls = Url.count({});
numberOfUrls.then(number => {
    // Now you can do whatever you need to do with the number
    console.log('number', number)
});

только один важный момент,

Запросы Mongoose не являются обещаниями. Они имеют функцию .then () для co и async / await для удобства. Если вам нужно полноценное обещание, используйте функцию .exec ().

http://mongoosejs.com/docs/promises.html

Надеюсь, это поможет!

...