从MongoDB 2.2开始,可以将“Expire Data from Collections Using a TTL”作为特殊索引类型实现。
最新版本的Doctrine ORM支持此Index Option。不幸的是我无法找到如何使用doctrine annotations / config文件正确设置此索引。
这就是我尝试这样做的方式,我希望有人可以帮我正确设置它:
<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document(collection="log")
* @MongoDB\Indexes({
* @MongoDB\Index(keys={"expiration"=1, "expireAfterSeconds"=30})
* //... other indexes go here
* })
*
*/
class Log
{
// ...
/**
* @MongoDB\Date
*/
protected $expiration;
// ...
}
然后当我执行php app/console doctrine:mongodb:schema:update
时(在symfony 2.3.x中)
生成索引,但生成的索引看起来不正确。
这是我在数据库中执行db.system.indexes.find();
时得到的结果:
{ "v" : 1, "key" : { "expiration" : 1, "expireAfterSeconds" : 30 }, "ns" : "mydatabase.log", "sparse" : false, "name" : "expiration_1_expireAfterSeconds_-1" }
与我手动创建索引不同:
db.log.ensureIndex( { "expiration": 1 }, { expireAfterSeconds: 30 } );
因为它生成以下索引:
{ "v" : 1, "key" : { "expiration" : 1 }, "ns" : "mydatabase.log", "name" : "expiration_1", "expireAfterSeconds" : 30 }
如何使用doctrine annotations / config files在日期字段上设置TTL?
答案 0 :(得分:2)
您正在将索引选项与keys
参数混合使用。 Index
注释还具有options
参数。请参阅Index annotation docs中的示例:
<?php
/**
* @Document(
* indexes={
* @Index(keys={"username"="desc"}, options={"unique"=true})
* }
* )
*/
class User
{
//...
}
这相当于将{unique: true}
作为第二个参数db.collection.ensureIndex()
传递。您可以将unique
替换为expireAfterSeconds
以创建TTL索引。