比较MongoDB聚合中的两个字段';s在查找的值上进行匹配

比较MongoDB聚合中的两个字段';s在查找的值上进行匹配,mongodb,Mongodb,我想比较两个动态字段,就像我所做的: $where:[“$foo\u update>$bar\u update”] 我需要这个来得到一堆必须更新的对象。如果它们必须更新,这取决于几个条件,所以这就是为什么我要使用聚合 相关零件的当前查询如下所示: [ {$sort:{“更新位置”:1} {$group:{ “_id”:“$bar”, “foo”:{“$first”:“$foo”}, “bar”:{“$first”:“$bar”}, “上次更新”:{“$last”:“$updated_at”}

我想比较两个动态字段,就像我所做的:

$where:[“$foo\u update>$bar\u update”]
我需要这个来得到一堆必须更新的对象。如果它们必须更新,这取决于几个条件,所以这就是为什么我要使用聚合

相关零件的当前查询如下所示:

[
{$sort:{“更新位置”:1}
{$group:{
“_id”:“$bar”,
“foo”:{“$first”:“$foo”},
“bar”:{“$first”:“$bar”},
“上次更新”:{“$last”:“$updated_at”}
} },
{$lookup:{
“from”:“table_foo”,
“localField”:“foo”,
“外域”:“\u id”,
“as”:“foo”
} },
{$lookup:{
“from”:“table_bar”,
“localField”:“bar”,
“外域”:“\u id”,
“as”:“bar”
} }
]
在这里,我可以使用另一个
$group
操作符将我需要的值输出到顶层,但我无法使用查找值,因为它主要是一个项目数组

在这里,一个项目是预期的(我也对此进行了查询,因为如果另一个项目被删除,我们需要更新)

所以现在我想比较一下
$last\u update
foo.update\u at
字段。在我的脑海中看起来是这样的

$match:{
“foo”:{
$elemMatch:{
“更新时间:{“$gte”:“$last_update”}
}
}
}
  • 这可能吗
  • 如果是,你会怎么做

是的,这是可能的。事实证明,您可以使用
$max
之类的运算符将数组的值移到顶部

现在我的解决方案是这样的:

[
/**以上查询的开头**/
{$group:{
“\u id”:“$\u id”,
“foo”:{“$first”:“$foo”},
“foo_updated”:{“$max”:“$foo_updated_at”},
“bar”:{“$first”:“$bar”},
“bar_updated”:{“$max”:“$bar.updated_at”},
“上次更新”:{“$last”:“$updated_at”}
},$项目:{
“\u id”:“$\u id”,
“foo”:“$foo”,
“foo_updated”:{“$gt”:[“$foo_updated”,“$last_create”]},
“酒吧”:“$bar”,
“bar_updated”:{“$gt”:[“$bar_updated”,“$last_create”]},
“上次创建”:“$last\u create”
},$match:{
“$or”:[
/**其他条件**/
{“foo_updated”:true},
{“bar_updated”:true}
]
} }
]

在$match之前,您应该使用$unwind,它不一定会将您的数组转换为object@styopdev。除了
$unwind
之外,还有其他处理数组的方法。但确实不清楚“连接”是什么数据看起来是这样的。一对一,一对多?也不是很清楚最后的目的是什么。如果比较不正确,请删除“文档”,或者只是删除不匹配的数组项(或适当的项)。这可能需要一些澄清。@BlakesSeven我想得到一个必须更新的记录列表(或在某些情况下删除)。此查询后,我们将所选记录传递到后端,以便后端可以使用它并决定要执行的操作。