在查找值上比较MongoDB聚合匹配中的两个字段

时间:2016-02-11 08:36:46

标签: mongodb

我想比较两个动态字段,比如我用:

$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_updatefoo.update_at字段。在我脑海里看起来像这样。

$match: {
  "foo": {
    $elemMatch: {
      "updated_at": { "$gte": "$last_update" }
    }
  }
}
  • 这可能吗?
  • 如果是的话,你会怎么做?

1 个答案:

答案 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 }
    ]
  } }
]