Подтвердить что ты не робот

Использование findOne в mongodb для получения элемента с максимальным id

Я пытаюсь извлечь один элемент из коллекции mongo, который имеет наибольшее поле _id. Я знаю, что это можно сделать, запросив:

db.collection.find().sort({_id: -1}).limit(1)

Но это вроде кажется нечетким, и мне было интересно, есть ли способ получить этот конкретный элемент, используя findOne()

Примечание. Я хочу сделать это, потому что, из того, что я читал в ObjectId, первые байты соответствуют милисекундам с эпохи и, следовательно, последним вставляемый элемент будет иметь наибольшее значение _id. Есть ли другой способ получить последний элемент, вставленный в коллекцию?

4b9b3361

Ответ 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);