Jak zdobyć ostatnie rekordy N w mongodb?

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: jww, 2010-12-12

15 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);
 804
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)

 129
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.

 14
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
2021-02-04 17:04:04

Możesz spróbować tej metody:

Uzyskaj całkowitą liczbę rekordów w kolekcji za pomocą

db.dbcollection.count() 

Następnie użyj skip:

db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
 8
Author: bello hargbola,
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
2019-01-23 18:50:42

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

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

 5
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

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

@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.
 5
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

Sortowanie, pomijanie itd.może być dość powolne w zależności od wielkości kolekcji.

Lepszą wydajność można osiągnąć, jeśli Twoja kolekcja jest indeksowana według pewnych kryteriów; a następnie możesz użyć kursora min ():

Najpierw indeksuj swoją kolekcję za pomocą db.collectionName.setIndex( yourIndex ) Możesz użyć rosnącej lub malejącej kolejności, co jest fajne, ponieważ chcesz zawsze "N ostatnich elementów"... więc jeśli indeksujesz według porządku malejącego, jest to takie samo, jak otrzymanie "pierwszych n pozycji".

Wtedy ty znajdź pierwszy element swojej kolekcji i użyj jego wartości pól index jako kryteriów min w wyszukiwaniu takim jak:

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

Oto odniesienie do kursora min (): https://docs.mongodb.com/manual/reference/method/cursor.min/

 5
Author: João Otero,
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
2020-06-10 14:03:04

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();
 3
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
 db.collection.find().sort({$natural: -1 }).limit(5)
 1
Author: satywan kumar,
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
2020-07-27 05:43:41
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)

Według dokumentacji mongoDB :

Możesz określić { $natural: 1}, aby zmusić zapytanie do wykonania skanowania kolekcji do przodu.

Możesz również określić { $natural: -1}, aby zmusić zapytanie do wykonania skanowania kolekcji odwrotnej.

 0
Author: Gili.il,
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
2020-06-20 09:12:55

Jeśli używasz kompasu MongoDB, możesz użyć sortowania plików do filtrowania,

Tutaj wpisz opis obrazka

 0
Author: Ishan Liyanage,
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
2020-06-19 05:37:55

Użyj operatora $slice do ograniczenia elementów tablicy

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

Gdzie geolocation jest tablicą danych, z której otrzymujemy ostatni 5 rekord.

 0
Author: KARTHIKEYAN.A,
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
2021-02-04 17:03:30

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