#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. А также почему вы думаете, что просмотр базы данных не подходит для вас? Я считаю, что это лучший вариант в соответствии с вашими требованиями по сравнению с непрерывным запросом к БД, что является плохим подходом во многих отношениях.