2016-04-04 87 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」retain「:false, \t」_msgid「:」45975d0d。ba68a4" , \t 「MAC」: 「20:15:04:01:12:75」, \t 「溫度」: 「-127.00」, \t 「嗡嗡」: 「679」, \t 「時間」: 「2016年01月04日15:43:09」 } –

回答

0

如果不知道更多信息,仍然很難說最好的解決方案。但這裏有一個建議,你可以嘗試(全部使用mongo shell)

在時間鍵上創建一個索引。

db.your_collection_name.createIndex({time:-1}) 

創建索引後,鍵入以下內容以確保正確完成。

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而不是forEachcursor。像這樣的:

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

請查看更新後的答案。 –