Как эффективно выполнять непрерывные запросы к базе данных mongodb

#node.js #mongodb

#node.js #mongodb

Вопрос:

Я новичок в Node и MongoDB, и у меня есть, казалось бы, простой запрос. Мне удалось подключиться к моей базе данных и использовать запрос для получения желаемых результатов. Теперь я хочу, чтобы этот запрос продолжался бесконечно, поскольку конечной целью моего проекта является отображение данных в реальном времени.

Я бы подумал, что простого цикла ‘while (true)’ будет достаточно, но, похоже, это не так.

 const MongoClient = require('mongodb').MongoClient;

// Connection URL
const url = 'mongodb://<username>:<password>@ds157614.mlab.com:57614/flight_data';


// Use connect method to connect to the Server
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {

  if (err) throw err;

  var dbo = db.db("flight_data").collection("data");

while(true)
{

    dbo.find().sort({_id: 1}).limit(1).toArray(function(err, result) {

    if (err) throw err;

    console.log("Temperature: "   result[0].data.temperature);

  });

}

db.close();

});
 

Я обнаружил, что цикл while действительно запущен, но по какой-то причине запрос просто не выполняется внутри цикла while. Если вы удалите цикл while, код будет работать нормально. Я просто хочу, чтобы он постоянно печатал результаты повторяющегося запроса.

Комментарии:

1. Вместо того, чтобы постоянно отправлять запросы в вашу базу данных в цикле while, я бы посоветовал изучить потоки изменений , чтобы эффективно отслеживать обновления интересующих коллекций.

Ответ №1:

Непрерывный запрос к БД неэффективен и приводит к потере ресурсов, вместо этого используйте потоки изменений. Он отслеживает коллекцию на предмет любых изменений и только тогда вызовет db. Работает только для Mongo 3.6 .

 const MongoClient = require("mongodb").MongoClient;

// Connection URL
const url =
  "mongodb://<username>:<password>@ds157614.mlab.com:57614/flight_data";

// Use connect method to connect to the Server
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
  if (err) throw err;

  const collection = db.collection("data");
  const changeStream = collection.watch();
  changeStream.on("change", next => {
    // process next document
    collection
      .find()
      .sort({ _id: 1 })
      .limit(1)
      .toArray(function(err, result) {
        if (err) throw err;

        console.log("Temperature: "   result[0].data.temperature);
      });
  });
  db.close();
});
 

Комментарии:

1. Я попробовал это, и теперь я получаю некоторые странные ошибки. Одним из них является MongoError: Majority read concern requested, but it is not supported by the storage engine.

2. @JessieLSmith Какую версию mongo вы используете? Для потоков изменений требуется MongoDB 3.6 .

3. Похоже, у меня есть 3.2.2. Новейшая версия, доступная для node.js драйвер — 3.2.3. Нужно ли мне искать другое решение, поскольку я не использую оболочку mongo?

4. The newest version available for the node.js driver is 3.2.3 Что вы имели в виду под этим? Вы, должно быть, сбиваете с толку node.js версия драйвера и версия сервера mongodb. Перейдите в оболочку mongo и введите db.version(), результатом будет ваша версия mongodb.

5. Я не уверен, почему у вас не установлена оболочка mongo, поскольку она поставляется по умолчанию при установке сервера mongo. А также почему вы думаете, что просмотр базы данных не подходит для вас? Я считаю, что это лучший вариант в соответствии с вашими требованиями по сравнению с непрерывным запросом к БД, что является плохим подходом во многих отношениях.