php - 使用 Doctrine MongoDB ODM 设置集合的 TTL

标签 php mongodb symfony doctrine-odm ttl

自 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/

相关文章:

php - 存储数据库,同时访问的良好模式

c# - 使用 C# 在 MongoDB 中查询、过滤和更新多级嵌套数组

php - 在 symfony 2 中实现用户事件

symfony - 了解 Assetic bundle

php - 如何在 Symfony 的配置中从服务容器调用方法?

php - IE : Unexpected call to method or property access 中的奇怪 jQuery 错误

mongodb - 在 mongodb 上通过 "second level"键选择

Symfony2-使用eventListener修改表单字段

php - 在 Elasticsearch php API 中使用多种类型或索引

java - 没有 map 的吗啡使用的类