我想获得最近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"
}
感谢您的帮助。
答案 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]));
}
});
希望这有帮助。