如何从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_on
或export
字段。除此之外,两者都可以为null或空或000000。
答案 0 :(得分:1)
这是因为在您执行$project
之后,您最终只会使用dst
和_id
字段,因此您无法在$match
上export.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
}
}
]