2013-08-22 55 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

相關問題