Как получить последние N записей в mongodb?
Я не могу найти, где это было документировано. По умолчанию операция find() приведет к началу записи записей. Как я могу получить последние N записей в mongodb?
Изменить: также я хочу, чтобы возвращаемый результат был заказан от менее недавнего до последнего, а не наоборот.
Ответы
Ответ 1
Если я понимаю ваш вопрос, вам нужно отсортировать его в порядке возрастания.
Предполагая, что у вас есть поле id или date, называемое "x", вы бы сделали...
.sort()
db.foo.find().sort({x:1});
1 будет сортировать по возрастанию (от старости до новейшего) и -1 будет сортировать нисходящие (самые новые до самых старых.)
Если вы используете автоматически созданное поле _id, у него есть дата, встроенная в него... поэтому вы можете использовать его для заказа по...
db.foo.find().sort({_id:1});
Это вернет обратно все ваши документы, отсортированные от самых старых до новейших.
Естественный порядок
Вы также можете использовать Природный заказ, упомянутый выше...
db.foo.find().sort({$natural:1});
Опять же, используя 1 или -1 в зависимости от вашего заказа.
Используйте .limit()
Наконец, хорошей практикой является добавление ограничения при выполнении такого широко открытого запроса, чтобы вы могли... либо
db.foo.find().sort({_id:1}).limit(50);
или
db.foo.find().sort({$natural:1}).limit(50);
Ответ 2
Последние N добавленные записи, от менее недавних до самых последних, можно увидеть с помощью этого запроса:
db.collection.find().skip(db.collection.count() - N)
Если вы хотите их в обратном порядке:
db.collection.find().sort({ $natural: -1 }).limit(N)
Если вы установите Mongo-Hacker, вы также можете использовать:
db.collection.find().reverse().limit(N)
Если вы устали писать эти команды все время, вы можете создавать пользовательские функции в ~/.mongorc.js. Например.
function last(N) {
return db.collection.find().skip(db.collection.count() - N);
}
то из оболочки mongo просто введите last(N)
Ответ 3
Чтобы получить последние N записей, вы можете выполнить следующий запрос:
db.yourcollectionname.find({$query: {}, $orderby: {$natural : -1}}).limit(yournumber)
если требуется только одна последняя запись:
db.yourcollectionname.findOne({$query: {}, $orderby: {$natural : -1}})
Примечание. Вместо $natural вы можете использовать один из столбцов из вашей коллекции.
Ответ 4
См. Раздел "Запросы: сортировка и естественный порядок", http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order, а также sort() в разделе "Методы курсора" http://www.mongodb.org/display./DOCS/Advanced + Запросы
Ответ 5
вы можете использовать sort()
, limit()
, skip()
, чтобы получить последний запуск N записей из любого пропущенного значения
db.collections.find().sort(key:value).limit(int value).skip(some int value);
Ответ 6
Вы не можете "пропустить" в зависимости от размера коллекции, потому что она не будет учитывать условия запроса.
Правильным решением является сортировка с нужной конечной точки, ограничение размера результирующего набора, а затем корректировка порядка результатов, если это необходимо.
Вот пример, основанный на реальном коде.
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
});
}
});
Ответ 7
Возможно, вы захотите использовать опции find
:
http://docs.meteor.com/api/collections.html#Mongo-Collection-find
db.collection.find({}, {sort: {createdAt: -1}, skip:2, limit: 18}).fetch();
Ответ 8
@бен-чен,
Вы можете использовать агрегирование для последних n записей подмножества документов в коллекции. Здесь упрощенный пример без группировки (который вы делали бы между этапами 4 и 5 в этом случае).
Это возвращает последние 20 записей (на основе поля под названием "timestamp" ), отсортированного по возрастанию. Затем он обрабатывает каждый документ _id, timestamp и whatever_field_you_want_to_show в результатах.
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)
}
поэтому результат будет выглядеть примерно так:
{
"_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
}
Надеюсь, что это поможет.
Ответ 9
db.collection.find().hint( { $natural : -1 } ).sort(field: 1/-1).limit(n)
согласно документации mongoDB:
Вы можете указать {$ natural: 1}, чтобы запрос выполнял прямое сканирование коллекции.
Вы также можете указать {$ natural: -1}, чтобы запрос выполнял обратное сканирование коллекции.
Ответ 10
используйте оператор $ slice для ограничения элементов массива
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}' });
});
где геолокация - это массив данных, из которого мы получаем последние 5 записей.
Ответ 11
Сортировка, пропуск и т.д. Могут быть довольно медленными в зависимости от размера вашей коллекции.
Лучшая производительность будет достигнута, если ваша коллекция будет проиндексирована по некоторым критериям; и тогда вы можете использовать курсор min():
Во-первых, индексируйте свою коллекцию с помощью db.collectionName.setIndex( yourIndex )
Вы можете использовать возрастающий или нисходящий порядок, что здорово, потому что вы всегда хотите, чтобы "N последних элементов"... так что, если вы индексируете в порядке убывания, это то же самое как получение "первых N предметов".
Затем вы находите первый элемент вашей коллекции и используете значения его индексного поля в качестве минимальных критериев поиска:
db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)
Вот ссылка на курсор min(): https://docs.mongodb.com/manual/reference/method/cursor.min/
Ответ 12
Вы можете попробовать этот метод:
Получить общее количество записей в коллекции с
db.dbcollection.count()
Тогда используйте skip:
db.dbcollection.find().skip(db.dbcollection.count() - 1).pretty()
Ответ 13
Последняя функция должна быть sort
, а не limit
.
Пример:
db.testcollection.find().limit(3).sort({timestamp:-1});