Nigdzie nie mogę tego znaleźć. Domyślnie operacja find () pobierze rekordy od początku. Jak mogę uzyskać ostatnie N rekordów w mongodb?
Edycja: chcę również, aby zwracany wynik był uporządkowany od mniej do najnowszego, a nie odwrotnie.
Nigdzie nie mogę tego znaleźć. Domyślnie operacja find () pobierze rekordy od początku. Jak mogę uzyskać ostatnie N rekordów w mongodb?
Edycja: chcę również, aby zwracany wynik był uporządkowany od mniej do najnowszego, a nie odwrotnie.
Odpowiedzi:
Jeśli rozumiem twoje pytanie, musisz sortować rosnąco.
Zakładając, że masz jakieś pole identyfikatora lub daty o nazwie „x”, zrobiłbyś ...
db.foo.find().sort({x:1});
1 sortuje rosnąco (od najstarszych do najnowszych) i -1 będzie sortowanie malejące (od najnowszych do najstarszych.)
Jeśli korzystasz z automatycznie utworzonego pola _id , ma on osadzoną datę ... więc możesz użyć go do zamówienia przez ...
db.foo.find().sort({_id:1});
Spowoduje to powrót wszystkich dokumentów posortowanych od najstarszego do najnowszego.
Możesz także użyć wspomnianego wyżej Naturalnego Porządku ...
db.foo.find().sort({$natural:1});
Ponownie, używając 1 lub -1 w zależności od żądanej kolejności.
Wreszcie, dobrą praktyką jest dodanie limitu podczas wykonywania tego rodzaju szeroko otwartych zapytań, aby można było wykonać ...
db.foo.find().sort({_id:1}).limit(50);
lub
db.foo.find().sort({$natural:1}).limit(50);
item = 3; item.add(3).divide(3) == 2; item.divide(3).add(3) == 4;
Bez zamówienia, jaki byłby wynik? Zgadzam się z tobą, że ta odwrócona kolejność nie jest intuicyjna. To nie jest SQL, w końcu powinien przestrzegać normalnych paradygmatów OO.
Ostatnie N dodanych rekordów, od najnowszych 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 , możesz również użyć:
db.collection.find().reverse().limit(N)
Jeśli masz dość pisania tych poleceń, możesz tworzyć własne funkcje w pliku ~ / .mongorc.js. Na przykład
function last(N) {
return db.collection.find().skip(db.collection.count() - N);
}
następnie z muszli mangowej po prostu wpisz last(N)
db.collection.find().reverse().limit(1)
daje mi błąd... has no method reverse
Aby uzyskać ostatnie N rekordów, możesz wykonać poniższe zapytanie:
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
jeśli chcesz tylko jeden ostatni rekord:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
Uwaga: Zamiast $ natural możesz użyć jednej z kolumn ze swojej kolekcji.
Możesz wypróbować tę metodę:
Uzyskaj całkowitą liczbę rekordów w kolekcji za pomocą
db.dbcollection.count()
Następnie użyj pominięcia:
db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
Zajrzyj do zapytania: Sortowanie i porządek naturalny, http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order, a także sort () w Cursor Methods http://www.mongodb.org/display / DOCS / Advanced + Queries
Nie można „pominąć” na podstawie wielkości kolekcji, ponieważ nie uwzględni ona warunków zapytania.
Prawidłowym rozwiązaniem jest sortowanie od pożądanego punktu końcowego, ograniczenie rozmiaru zestawu wyników, a następnie, w razie potrzeby, dostosowanie kolejności wyników.
Oto przykład oparty na kodzie rzeczywistym.
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
});
}
});
var query = collection.find( { conditions } ).sort({$natural : -1}).reverse().limit(N)
.
@ bin-chen,
Możesz użyć agregacji dla ostatnich n wpisów podzbioru dokumentów w kolekcji. Oto uproszczony przykład bez grupowania (co w tym przypadku można zrobić między etapami 4 i 5).
Zwraca 20 ostatnich wpisów (na podstawie pola o nazwie „znacznik czasu”), posortowanych rosnąco. Następnie wyświetla w wynikach każdy dokument _id, znacznik czasu i cokolwiek_pole_na_na_na_wyświetleniu.
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 mniej więcej tak:
{
"_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.
Sortowanie, pomijanie itd. Może być dość powolne, w zależności od wielkości Twojej kolekcji.
Lepszą wydajność można osiągnąć, jeśli masz kolekcję indeksowaną według niektórych kryteriów; a następnie możesz użyć kursora min ():
Po pierwsze, indeksuj kolekcję za pomocą db.collectionName.setIndex( yourIndex )
Możesz użyć rosnącej lub malejącej kolejności, co jest fajne, ponieważ chcesz zawsze mieć „N ostatnich pozycji” ... więc jeśli indeksujesz według malejącej kolejności, to to samo, co uzyskanie „pierwszych N pozycji” .
Następnie znajdujesz pierwszy element swojej kolekcji i używasz jego wartości pola indeksu jako minimalnych kryteriów wyszukiwania, takich jak:
db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)
Oto odwołanie do kursora min (): https://docs.mongodb.com/manual/reference/method/cursor.min/
db.collectionName.find().hint(yourIndex).limit(N)
Jeśli indeks jest w porządku malejącym, otrzymasz N minimalnych wartości.
Możesz skorzystać z find
opcji:
http://docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
zgodnie z dokumentacją mongoDB :
Możesz określić {$ natural: 1}, aby zmusić zapytanie do wykonania skanowania kolekcji do przodu.
Możesz także określić {$ natural: -1}, aby wymusić wykonanie przez kwerendę skanowania kolekcji wstecznej.
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 geolokalizacja to tablica danych, z których otrzymujemy ostatnie 5 rekordów.
Ostatnią funkcją powinno być sort
, nie limit
.
Przykład:
db.testcollection.find().limit(3).sort({timestamp:-1});
sort
być później limit
?