0

我有一个将存储访问者数据的 mongodb。我需要在十分钟不活动后删除数据,并将通过 cron 运行命令。我该怎么做?

目前该集合的设置如下:

{ "_id" : ObjectId("4fd33e0b0feeda3b2406f6be"), "name" : "Dugley Reanimator", "updated" : "Some form of timestmap" }

我应该如何存储一个时间戳,我用 IE 搜索我的 MySql 版本的集合:

$sql = mysql_query('DELETE FROM `visitors` WHERE NOW() > DATE_ADD(`last_seen`, INTERVAL 10 MINUTE)');
4

3 回答 3

1

最好的方法是使用 _id 字段(如果插入时时间戳相同)。

_id 字段可以指示您的时间,您可以执行 $lte 查询来删除旧值。

我在这里写过:http ://blog.dicarsio.com/post/10739857186/quick-snippet-get-creation-time-from-id-on-mongodb

于 2012-06-09T18:01:06.960 回答
1

ObjectId 有一个时间戳组件。请参阅此处的文档。这实质上为您提供了可用于排序和查询的空闲插入时间。

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>})   
于 2012-06-09T22:24:55.157 回答
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)
于 2012-06-09T15:31:55.500 回答