我有一个将存储访客数据的mongodb。我需要在十分钟未激活后删除数据,并通过cron运行命令。我该怎么做?
目前,该集合的设置如下:
{ "_id" : ObjectId("4fd33e0b0feeda3b2406f6be"), "name" : "Dugley Reanimator", "updated" : "Some form of timestmap" }
我应该如何存储我使用I.E搜索我的MySql版本的集合的时间戳:
$sql = mysql_query('DELETE FROM `visitors` WHERE NOW() > DATE_ADD(`last_seen`, INTERVAL 10 MINUTE)');
答案 0 :(得分:1)
使用_id字段执行此操作的最佳方法(如果插入时的时间戳相同)。
_id字段可以指示您的时间,您可以执行$ lte查询来删除旧值。
我在这里写过:http://blog.dicarsio.com/post/10739857186/quick-snippet-get-creation-time-from-id-on-mongodb
答案 1 :(得分:1)
ObjectId有一个时间戳组件。 see the docs here。这实际上为您提供了一个免费的插入时间,您可以使用for sorting and querying。
mongodb驱动器应该为您提供一种从时间戳创建ObjectId的方法。
在Python中:
gen_time = datetime.datetime(2010, 1, 1)
dummy_id = ObjectId.from_datetime(gen_time)
在Java中:
Date d = new Date(some timestamp in ms);
ObjectId id = new ObjectId(d)
因此,一旦您基于“10分钟前”创建了一个ObjectId,您就可以使用$ lt进行删除查询
在js控制台中它将是:
db.collectionName.remove({_id: {$lt: <Your Object Id that represents 10 minutes ago>})
答案 2 :(得分:0)
您的驱动程序将使用MongoDate时间(这可能会映射到PHP中更原生的表示形式) 然后,您可以使用以下mongo语句进行查询:
db.myCollection.find({updated : { $lte : new ISODate("2012-06-09T16:22:50Z") } })
PHP的粗略翻译将是:
$search = array(
'updated' => array(
'$lte' => new MongoDate($tenMinutesAgo))
);
$collection->find($search)
或(警告:未经测试):
$tenMinutesAgo = new DateTime();
$tenMinutesAgo->modify('-10 minutes');
$search = array('updated' => array('$lte' => $tenMinutesAgo));
$collection->find($search)