2016-04-04 2 views
0

Я хочу получить последние 10 записей и самую новую запись, которая только что добавлена. Я попытался использовать хвостовой курсор, но мне потребовалось слишком много времени, потому что он должен отсканировать всю коллекцию, прежде чем дойти до конца коллекции, чтобы ждать данных.Запросить данные из большой коллекции MongoDB - Nodejs

{ 
    "_id" : ObjectId("56fe349d0ef0edb520f0ca29"), 
    "topic" : "IoTeam/messages/", 
    "payload" : "20:15:04:01:12:75,-127.00,679", 
    "qos" : 0, 
    "retain" : false, 
    "_msgid" : "45975d0d.ba68a4", 
    "mac" : "20:15:04:01:12:75", 
    "temp" : "-127.00", 
    "hum" : "679", 
    "time" : "01/04/2016 15:43:09" 
} 

Благодарим за помощь.

+3

Есть много вещей, которые вы можете сделать, чтобы помочь увеличить производительность mongodb, но без дополнительной информации мы не можем помочь. Отправьте свой дизайн схемы и что именно вы пытаетесь сделать, и тогда будет легче предоставить рекомендации. – user2263572

+0

привет. спасибо за ваш ответ. –

+0

Я хочу запросить 10 последних записей и записей живых данных. С небольшой коллекцией он отлично подходит при использовании хвостового курсора, но с большой коллекцией (около 20000 записей) хвостовой курсор занимает слишком много времени для сканирования с первой записи на последнюю запись. { \t "_id": ObjectId ("56fe349d0ef0edb520f0ca29"), \t "тема": "IoTeam/сообщения /", \t "полезная нагрузка": «20: 15: 04: 01: 12: 75, -127.00,679 ", \t" qos ": 0, \t" сохранить ": false, \t" _msgid ":" 45975d0d.ba68a4" , \t "Mac": "20: 15: 04: 01: 12: 75", \t "Темп": "-127,00", \t "шум": "679", \t "время": "01/04/2016 15:43:09" } –

ответ

0

Все еще сложно сказать лучшее решение, не зная дополнительной информации. Но вот одно предложение, которое вы могли бы попробовать (все с использованием оболочки mongo)

Создайте индекс по ключевому слову времени.

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

db.your_collection_name.getIndexes() 

Это приведет к отображению ваших индексов, и вы увидите, что для ключа времени был добавлен новый.

Предупреждение: Хотя это уменьшит время, затрачиваемое на запрос ключа времени, это увеличит время, затрачиваемое на вставку новых записей в вашу базу данных. Это связано с тем, что новые вставки нужно индексировать. Поэтому учитывайте это при масштабировании вашего приложения, и это может означать, что вы хотите справиться с этим по-другому.

+0

извините за мой плохой английский. Моя проблема - просто e как http://stackoverflow.com/questions/26592542/how-do-i-move-a-tailable-cursor-with-awaitdata-to-the-end-so-i-just-get-new-upda –

0

Прежде всего, создайте индекс в поле time.

db.collection('nameOfYourCollection') 
    .createIndex(
     { "time": -1 }, 
     null, 
     function(err, results){ 
      console.log(results); 
     }); 

Это создаст индекс в поле time вашей коллекции. Это может занять некоторое время. Но как только индекс будет создан, запросы будут намного быстрее.

После этого в запросе просто сделать это:

var cursor = db.collection('nameOfYourCollection').find().sort([ ["time", -1] ]).limit(10); 
cursor.forEach(function(doc){ 
    if(doc) console.log("Got the document as : " + JSON.stringify(doc)); 
}, function(err){ 
    if(err) console.log("Error: " + JSON.stringify(err)); 
}); 

Это даст вам последние 10 записей, которые были вставлены в коллекции.

Вы также можете позвонить по телефону toArray вместо forEach в cursor. Что-то вроде этого:

var cursor = db.collection('nameOfYourCollection').find().sort([ ["time", -1] ]).limit(10); 
cursor.toArray(function(err, docs){ 
    if(err) console.log("Error: " + JSON.stringify(err)); 
    if(docs){ 
     console.log("Got the document as : " + JSON.stringify(docs)); 
     console.log("This is the latest record that was inserted : " + JSON.stringify(docs[0])); 
    } 
}); 

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

+0

Мне также нужно отслеживать новую запись, вставленную в реальном времени –

+0

. Пожалуйста, посмотрите обновленный ответ. –

Смежные вопросы