2013-08-22 57 views
1

由于MongoDB 2.2可以将“Expire Data from Collections Using a TTL”作为特殊索引类型实现。使用Doctrine MongoDB设置TTL收集ODM

最新版本的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 annotati在日期字段上设置TTL ons/config文件?

回答

2

您正在将索引选项与keys参数混合使用。 Index注释还有一个options参数。参见示例在Index annotation docs

<?php 

/** 
* @Document(
* indexes={ 
*  @Index(keys={"username"="desc"}, options={"unique"=true}) 
* } 
*) 
*/ 
class User 
{ 
    //... 
} 

这等效于通过{unique: true}作为第二个参数db.collection.ensureIndex()。您可以用expireAfterSeconds替换unique以创建TTL索引。

+0

谢谢你的回答!根据你的回答我最终使用的是:@MongoDB \ Index(keys = {“expiration”= true},options = {“expireAfterSeconds”= 30}) – Onema

相关问题