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.
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);
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)
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.
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()
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);
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
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
});
}
});
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.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/
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();
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)
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.
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
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.
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});
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