mongodb: jak zdobyć ostatnie rekordy N?

Nigdzie nie mogę znaleźć tego udokumentowanego. Domyślnie operacja find() pobierze rekordy od początku. Jak Mogę uzyskać ostatnie rekordy N w mongodb?

Edit: chcę również, aby zwrócony wynik był uporządkowany od mniej niedawnego do najnowszego, a nie odwrotnie.

Author: Ripon Al Wasim, 2010-12-12

9 answers

Jeśli rozumiem twoje pytanie, musisz posortować je w porządku rosnącym.

Zakładając, że masz jakieś pole id lub date o nazwie "x", zrobisz to ...

.sort ()


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

The 1 posortuje rosnąco (od najstarszego do najnowszego) i -1 sortuje malejąco (Od najnowszego do najstarszego.)

Jeśli używasz automatycznie utworzonego pola _id , to data jest w nim osadzona ... więc możesz użyć tego do zamówienia przez ...

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

To zwróci wszystkie Twoje dokumenty posortowane od najstarszych do najnowszych.

Porządek Naturalny


Można również użyć naturalnego porządku wymienionego powyżej ...

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

Ponownie, używając 1 lub -1 w zależności od zamówienia, które chcesz.

Użyj .limit ()


Na koniec, dobrą praktyką jest dodawanie limitu podczas wykonywania tego rodzaju szeroko otwartych zapytań, aby móc wykonać jedno i drugie ...

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

Lub

db.foo.find().sort({$natural:1}).limit(50);
 554
Author: Justin Jenkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-13 01:23:54

OstatnieN dodane rekordy, od mniej ostatnich do najnowszych, można zobaczyć za pomocą tego zapytania:

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

Jeśli chcesz je w odwrotnej kolejności:

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

Jeśli zainstalujesz Mongo-Hacker {[13] } możesz również użyć:

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

Jeśli znudzi ci się pisanie tych poleceń przez cały czas, możesz tworzyć własne funkcje w swoim~/.mongorc.js. Np.

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

Następnie z muszli mongo wpisz last(N)

 87
Author: Trasplazio Garzuglio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-19 03:40:10

W celu uzyskania ostatnich n rekordów możesz wykonać poniższe zapytanie:

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

Jeśli chcesz tylko jedną ostatnią płytę:

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

Uwaga: zamiast $natural możesz użyć jednej z kolumn ze swojej kolekcji.

 11
Author: Ashwini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-18 16:57:12

Możesz użyć sort() , limit() ,skip() aby uzyskać ostatni N rekord start z dowolnej pominiętej wartości

db.collections.find().sort(key:value).limit(int value).skip(some int value);
 5
Author: pkp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-18 09:35:38

Nie można "pominąć" w zależności od wielkości kolekcji, ponieważ nie uwzględnia ona warunków zapytania.

Poprawnym rozwiązaniem jest sortowanie od pożądanego punktu końcowego, ograniczenie rozmiaru zestawu wyników, a następnie dostosowanie kolejności wyników w razie potrzeby.

Oto przykład, oparty na rzeczywistym kodzie.

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
        });
    }
});
 5
Author: Marty Hirsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-13 18:21:07

Zajrzyj pod zapytanie: sortowanie i kolejność naturalna, http://www.mongodb.org/display/DOCS/Sorting+i + naturalny + porządek jak również metody sort () pod kursorem http://www.mongodb.org/display/DOCS/Advanced + Queries

 4
Author: Steve Wilhelm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-12 10:35:42

Możesz użyć opcji find : http://docs.meteor.com/api/collections.html#Mongo-Collection-find

db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
 2
Author: Lucbug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-05 22:38:28

@bin-chen,

Można użyć agregacji dla najnowszych N wpisów podzbioru dokumentów w zbiorze. Oto uproszczony przykład bez grupowania (co w tym przypadku robisz między etapami 4 i 5).

Zwraca ostatnie 20 pozycji (na podstawie pola o nazwie "timestamp"), posortowanych rosnąco. Następnie wyświetla każdy dokument _id, timestamp i whatever_field_you_want_to_show w wynikach.

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)
}

Więc wynik wyglądałby coś like:

{ 
    "_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
}
Mam nadzieję, że to pomoże.
 1
Author: lauri108,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-05 06:48:34

Ostatnia funkcja powinna być sort, a nie limit.

Przykład:

db.testcollection.find().limit(3).sort({timestamp:-1}); 
 -5
Author: Ramesh Kasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 14:04:11