自 MongoDB 2.2 起,可以将“Expire Data from Collections Using a TTL”作为特殊索引类型实现。
最新版本的 Doctrine ORM 支持此 Index Option 。不幸的是,我无法找到如何使用学说注释/配置文件正确设置此索引。
这就是我尝试执行的方法,我希望有人可以帮助我正确设置它:
<?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/consoledoctrine: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 }
如何使用学说注释/配置文件在日期字段上设置 TTL?
最佳答案
您将索引选项与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 索引。
关于php - 使用 Doctrine MongoDB ODM 设置集合的 TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18387901/