使用Doctrine MongoDB ODM设置TTL以进行收集

时间:2013-08-22 18:13:16

标签: php mongodb symfony doctrine-odm ttl

从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?

1 个答案:

答案 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索引。