Запрос MongoDB для документа старше 30 секунд

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

Не то чтобы это имело значение, но для этого я использую mongojs.

С каждым документом связано created время.


person Nick Parsons    schedule 05.02.2014    source источник


Ответы (4)


Мы предполагаем, что у вас есть created_at или подобное поле в вашем документе, в котором указано время, когда оно было вставлено или иным образом изменено, в зависимости от того, что для вас важно.

Вместо того, чтобы перебирать результаты, вы можете посмотреть параметр multi в update< /strong>, чтобы применить изменения ко всем документам, соответствующим вашему запросу. Установка времени, в которое вы хотите заглянуть, должна быть довольно простой.

В синтаксисе оболочки, который должен быть почти таким же, как у драйвера:

db.collection.update({
     created_at: {$lt: time },
     state: oldstate 
},
{$set: { state: newstate } }, false, true )

Первый false предназначен для upserts, что не имеет никакого смысла в этом использовании, а второй true обозначает multi обновление документа.

Если документы действительно будут недолговечными и впоследствии они вам больше не понадобятся, вы можете рассмотреть закрытые коллекции. У вас может быть опция total size или time to live для них, и естественный порядок вставки благоприятствует обработке записей в очереди.

person Neil Lunn    schedule 06.02.2014

Если вы хотите сделать это с помощью оболочки mongo:

db.requests.find({created: {$lt: new Date((new Date())-1000*60*60*72)}}).count()

... найдет документы старше 72 часов ("сейчас" минус "72*60*60*1000" мсек). 30 секунд будут 1000*30.

person Friponneau    schedule 19.03.2014

Вы можете использовать что-то вроде этого:

var d = new Date();
d.setSeconds(d.getSeconds() - 30);

db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {} );
person Pablo Cantero    schedule 06.02.2014
comment
Я не был уверен, как получить объект даты в правильном формате для использования с запросом. Это сработало отлично. Спасибо! - person Will Schoenberger; 03.07.2014

Вариант TTL также является элегантным решением. Это индекс, который автоматически удаляет документы через x секунд, см. здесь: https://docs.mongodb.org/manual/core/index-ttl/

Пример кода:

db.yourCollection.createIndex({ created:1 }, { expireAfterSeconds: 30 } )

person a4xrbj1    schedule 27.04.2016
comment
Для тех, кто будет использовать индексы TTL, обратите внимание: The TTL index does not guarantee that expired data will be deleted immediately upon expiration. There may be a delay between the time a document expires and the time that MongoDB removes the document from the database. - person bmdelacruz; 08.05.2019