查询时间戳字段比使用PHP的MongoDB中的另一个时间戳字段更旧

时间:2016-09-23 11:25:30

标签: php mongodb

如何从MongoDB集合中获取特定字段1(时间戳或日期)比另一个特定字段2(时间戳或日期)更旧/更新的对象?

给出以下示例对象:

// MongoDB 3.2
{
  name: 'test',
  updated_on: Timestamp(1474416000, 0),
  export: {
    active: true,
    last_exported_on: Timestamp(1474329600, 0)
  }
}

此对象应与以下查询匹配:where export.active is true and updated_on > export.last_exported_on

我已经尝试使用聚合框架,因为我已经读过那里的$可能非常慢,但没有任何成功。

// PHP 5.4 (and MongoDB PHP lib. http://mongodb.github.io/mongo-php-library)
$collection->aggregate([
  ['$project' => [
    'dst' => ['$cmp' => ['updated_on', 'export.last_exported_on']],
    'name' => true
  ]],
  ['$match' => ['dst' => ['$gt' => 0], 'export.active' => ['$eq' => true]]],
  ['$limit' => 1]
]);

我可以将时间戳更改为日期或其他任何内容,但我没有在类型中看到问题。

修改:并非所有对象都包含last_exported_onexport字段。除此之外,两者都可以为null或空或000000。

1 个答案:

答案 0 :(得分:1)

这是因为在您执行$project之后,您最终只会使用dst_id字段,因此您无法在$matchexport.active。您需要在投影前与export.active匹配。之后,您需要dst字段上的其他匹配。

[
    {
        $match: {
            "export.active": true
        }
    },
    {
        $project: {
            dst: {
                $cmp: [
                    "$updated_on",
                    "$export.last_exported_on"
                ]
            }
        }
    },
    {
        $match: {
            dst: 1
        }
    }
]

修改

或者,您可以确保保留export.active并另外$match

[
    {
        $project: {
            "export.active": 1,
            cmp: {
                $cmp: [
                    "$updated_on",
                    "$export.last_exported_on"
                ]
            }
        }
    },
    {
        $match: {
            cmp: 1,
            "export.active": true
        }
    }
]