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