查询来自大型MongoDB集合的实时数据 - Nodejs

时间:2016-04-04 01:30:14

标签: node.js mongodb large-data

我想获得最近10条记录和刚刚添加的最新记录。 我试图使用tailable游标,但它花了我太多时间,因为它必须扫描整个集合才能到达收集结束时等待数据。

{
    "_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"
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在不了解更多信息的情况下仍难以说出最佳解决方案。但是这里有一个建议,你可以尝试(所有使用mongo shell)

在时间键上创建索引。

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

创建索引后,键入以下内容以确保正确完成。

db.your_collection_name.getIndexes()

这将列出您的索引,您应该会看到为时间键添加了新索引。

警告:虽然这会减少查询时间键所需的时间,但会增加将新记录插入数据库所需的时间。这是因为需要对新插入物进行索引。因此,在扩展您的应用时,请考虑到这一点,这可能意味着您将要以不同的方式处理此问题。

答案 1 :(得分: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]));
    }
});

希望这有帮助。