我想比较两个动态字段,比如我用:
$where: [ "$foo_update > $bar_update" ]
我需要这个来获得一堆必须更新的对象。如果它们必须更新,这取决于几个条件,这就是为什么我想用聚合来实现它。
相关部分的当前查询如下:
[
{ $sort: { "updated_at": 1 }
{ $group: {
"_id" : "$bar",
"foo" : { "$first" : "$foo" },
"bar" : { "$first" : "$bar" },
"last_update" : { "$last " : "$updated_at" }
} },
{ $lookup: {
"from" : "table_foo",
"localField" : "foo",
"foreignField" : "_id",
"as" : "foo"
} },
{ $lookup: {
"from" : "table_bar",
"localField" : "bar",
"foreignField" : "_id",
"as" : "bar"
} }
]
在这里,我可以跟随另一个$group
运算符,将我需要的值输出到顶层。但我不能用查找值来做,因为它主要是一个项目数组。
这里有一个项目(我也会对此进行查询,因为如果删除了其他项目我们需要更新)。
现在我要比较$last_update
和foo.update_at
字段。在我脑海里看起来像这样。
$match: {
"foo": {
$elemMatch: {
"updated_at": { "$gte": "$last_update" }
}
}
}
答案 0 :(得分:0)
是的,这是可能的。事实证明,您可以使用$max
等运算符将数组的值移到顶部。
所以我的解决方案现在看起来像这样:
[
/** the beginning of the query above **/
{ $group: {
"_id" : "$_id",
"foo" : { "$first" : "$foo" },
"foo_updated" : { "$max" : "$foo_updated_at" },
"bar" : { "$first" : "$bar" },
"bar_updated" : { "$max" : "$bar.updated_at" },
"last_update" : { "$last " : "$updated_at" }
}, $project: {
"_id" : "$_id",
"foo" : "$foo",
"foo_updated" : { "$gt": [ "$foo_updated", "$last_create" ] },
"bar" : "$bar",
"bar_updated" : { "$gt": [ "$bar_updated", "$last_create" ] },
"last_create" : "$last_create"
}, $match: {
"$or": [
/** other conditions **/
{ "foo_updated": true },
{ "bar_updated": true }
]
} }
]