Использование findOne в mongodb для получения элемента с максимальным id
Я пытаюсь извлечь один элемент из коллекции mongo, который имеет наибольшее поле _id. Я знаю, что это можно сделать, запросив:
db.collection.find().sort({_id: -1}).limit(1)
Но это вроде кажется нечетким, и мне было интересно, есть ли способ получить этот конкретный элемент, используя findOne()
Примечание. Я хочу сделать это, потому что, из того, что я читал в ObjectId, первые байты соответствуют милисекундам с эпохи и, следовательно, последним вставляемый элемент будет иметь наибольшее значение _id. Есть ли другой способ получить последний элемент, вставленный в коллекцию?
Ответы
Ответ 1
Вы должны использовать find
, как и вы, а не агрегацию, которая будет медленнее, поскольку для проверки всех значений полей _id необходимо определить максимальные значения.
Как отмечалось в комментариях, нет никакой разницы между использованием find() и findOne() - функционально или элегантно. Фактически, findOne
в оболочке (и в драйверах, которые ее реализуют) определяется в терминах find (с пределом -1 и с довольно печатной в оболочке).
Если вы действительно хотите сделать эквивалент
db.collection.find().sort({_id:-1}).limit(1).pretty()
как findOne
вы можете сделать это с помощью этого синтаксиса:
db.collection.findOne({$query:{},$orderby:{_id:-1}})
Ответ 2
Вы можете получить max _id, используя агрегацию mongodb. Поиск и сортировка могут быть переполнены.
db.myCollection.aggregate({
$group: {
_id: '',
last: {
$max: "$_id"
}
}
});
Ответ 3
с драйвером PHP (mongodb)
используя findOne()
$filter=[];
$options = ['sort' => ['_id' => -1]]; // -1 is for DESC
$result = $collection->findOne(filter, $options);
$maxAge = $result['age']
Ответ 4
import pymongo
tonystark = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = tonystark["tonystark_db"]
savings = mydb["customers"]
x = savings.find().sort("_id")
for s in x:
print(s)
Ответ 5
$maxId="";
$Cursor =$collection->find();
foreach($cursor as $document) {
$maxid =max($arr=(array($document['id'])));
}
print_r($maxid+1);