首页 文章

mongodb:如何获得最后的N条记录?

提问于
浏览
410

我无法找到任何记录在案的地方 . 默认情况下,find()操作将从头开始获取记录 . 如何获取mongodb中的最后N条记录?

编辑:我也希望返回的结果从最近的到最近的顺序排序,而不是相反 .

11 回答

  • 89

    @斌臣,

    您可以将聚合用于集合中文档子集的最新n个条目 . 这是一个没有分组的简化示例(在这种情况下,您将在第4和第5阶段之间进行分组) .

    这将返回最新的20个条目(基于名为“timestamp”的字段),按升序排序 . 然后它将每个文档_id,timestamp和whatever_field_you_want_to_show投影到结果中 .

    var pipeline = [
            {
                "$match": { //stage 1: filter out a subset
                    "first_field": "needs to have this value",
                    "second_field": "needs to be this"
                }
            },
            {
                "$sort": { //stage 2: sort the remainder last-first
                    "timestamp": -1
                }
            },
            {
                "$limit": 20 //stage 3: keep only 20 of the descending order subset
            },
            {
                "$sort": {
                    "rt": 1 //stage 4: sort back to ascending order
                }
            },
            {
                "$project": { //stage 5: add any fields you want to show in your results
                    "_id": 1,
                    "timestamp" : 1,
                    "whatever_field_you_want_to_show": 1
                }
            }
        ]
    
    yourcollection.aggregate(pipeline, function resultCallBack(err, result) {
      // account for (err)
      // do something with (result)
    }
    

    所以,结果看起来像:

    { 
        "_id" : ObjectId("5ac5b878a1deg18asdafb060"),
        "timestamp" : "2018-04-05T05:47:37.045Z",
        "whatever_field_you_want_to_show" : -3.46000003814697
    }
    { 
        "_id" : ObjectId("5ac5b878a1de1adsweafb05f"),
        "timestamp" : "2018-04-05T05:47:38.187Z",
        "whatever_field_you_want_to_show" : -4.13000011444092
    }
    

    希望这可以帮助 .

  • 12

    您不能根据集合的大小“跳过”,因为它不会考虑查询条件 .

    正确的解决方案是从所需的终点进行排序,限制结果集的大小,然后根据需要调整结果的顺序 .

    这是一个基于真实世界代码的例子 .

    var query = collection.find( { conditions } ).sort({$natural : -1}).limit(N);
    
    query.exec(function(err, results) {
        if (err) { 
        }
        else if (results.length == 0) {
        }
        else {
            results.reverse(); // put the results into the desired order
            results.forEach(function(result) {
                // do something with each result
            });
        }
    });
    
  • 4
    db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
    

    根据mongoDB Documentation

    您可以指定{$ natural:1}以强制查询执行转发集合扫描 . 您还可以指定{$ natural:-1}以强制查询执行反向收集扫描 .

  • 5

    最后一个函数应该是 sort ,而不是 limit .

    例:

    db.testcollection.find().limit(3).sort({timestamp:-1});
    
  • 2

    使用此查询可以看到最近的 N 添加的记录,从最近到最近的记录:

    db.collection.find().skip(db.collection.count() - N)
    

    如果你想以相反的顺序:

    db.collection.find().sort({ $natural: -1 }).limit(N)
    

    如果您安装Mongo-Hacker,您还可以使用:

    db.collection.find().reverse().limit(N)
    

    如果您厌倦了编写这些命令,您可以在〜/ .mongorc.js中创建自定义函数 . 例如 .

    function last(N) {
        return db.collection.find().skip(db.collection.count() - N);
    }
    

    然后从mongo shell中输入 last(N)

  • 577

    使用 $slice 运算符来限制数组元素

    GeoLocation.find({},{name: 1, geolocation:{$slice: -5}})
        .then((result) => {
          res.json(result);
        })
        .catch((err) => {
          res.status(500).json({ success: false, msg: `Something went wrong. ${err}` });
    });
    

    geolocation是数据数组,我们得到最后5条记录 .

  • 1

    你可以使用 sort()limit()skip() 从任何跳过的值开始最后N个记录

    db.collections.find().sort(key:value).limit(int value).skip(some int value);
    
  • 5

    如果我理解你的问题,你需要按升序排序 .

    假设你有一些名为“x”的id或日期字段你会做...

    .sort()


    db.foo.find().sort({x:1});
    

    1 将按升序排序(从最旧到最新), -1 将按降序排序(从最新到最旧) .

    如果您使用自动创建的 _id 字段,则会在其中嵌入日期...因此您可以使用它来按顺序排序...

    db.foo.find().sort({_id:1});
    

    这将返回从最旧到最新排序的所有文档 .

    自然秩序


    您也可以使用上面提到的Natural Order ...

    db.foo.find().sort({$natural:1});
    

    同样,根据您想要的顺序使用 1-1 .

    使用.limit()


    最后,在进行这种大开放查询时添加限制是一个好习惯,这样你就可以做到...

    db.foo.find().sort({_id:1}).limit(50);
    

    要么

    db.foo.find().sort({$natural:1}).limit(50);
    
  • 0

    为了获得最后N条记录,您可以执行以下查询:

    db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
    

    如果你只想要最后一条记录:

    db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
    

    注意:代替$ natural,您可以使用集合中的一列 .

  • 0

    查看下查询:排序和自然顺序,http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order以及光标方法下的sort()http://www.mongodb.org/display/DOCS/Advanced+Queries

  • -5

    您可能想要使用 find 选项:http://docs.meteor.com/api/collections.html#Mongo-Collection-find

    db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
    

相关问题