使用 mongo 模板的内部查询
Inner query using mongo template
我是 MongoDB 和 Spring mongotemplate 的新手。我想使用 mongotemplate 构建一个查询,其在 Postgres 中的等价物是
select * from feedback
where feedback.outletId in (
select outletId from feedback
where feedback.createdOn >= '2013-05-03'::date
)
这在 MongoDB 中甚至可能吗?
好吧,MongoDB 中没有内部查询的概念,所以基本上可以通过 2 个查询来实现,但您可能已经知道并想要一个 'better' 解决方案。既然你问它是否可能,我认为它可以通过聚合来实现,但是这可能很棘手。
db.feedback.aggregate([
{$project : {
'outletId' : 1,
'feedback._id' : '$_id',
'feedback.createdOn' : '$createdOn',
'feedback.a' : '$a'
}},
{$group : {
_id : $outletId,
feedbacks : {$addToSet : '$feedback'}
}},
{$match : {
'feedbacks.createdOn' : {
$gte : ISODate('2013-05-03')}
}},
{$unwind : '$feedback'}]);
您可以在最后添加一个 $project 阶段,将子对象转换为文档中的值。我知道它看起来不好看,但我会逐步解释它,
首先我们投影一个文档,将所有需要的字段放在一个名为反馈的子字段中,
在第二阶段,我们按 outletId 对其进行分组,并将所有子反馈放入一个名为 feedbacks 的数组中(因此对于每个 outletid,我们都会获得所有反馈)。
在第三阶段,我们使用 $match 过滤掉数组中甚至没有一个 createdOn 字段大于设置日期的反馈,
过滤掉这些 outletId 后,我们调用 unwind 将反馈数组中的每个子项作为单个文档获取。
现在,如果我们谈论 mongoTemplate,是的,它接受所有这些聚合参数,包括在第一阶段的反馈中嵌套子项。看看 TypedAggregation
的一些例子
如果您将 createdOn 字段保存为字符串而不是时间戳或 ISODate,即使正常的 mongo 查询在您需要查找范围时也无法处理它,因为它在您的 postgres 示例中有效。
希望对您有所帮助。
我是 MongoDB 和 Spring mongotemplate 的新手。我想使用 mongotemplate 构建一个查询,其在 Postgres 中的等价物是
select * from feedback
where feedback.outletId in (
select outletId from feedback
where feedback.createdOn >= '2013-05-03'::date
)
这在 MongoDB 中甚至可能吗?
好吧,MongoDB 中没有内部查询的概念,所以基本上可以通过 2 个查询来实现,但您可能已经知道并想要一个 'better' 解决方案。既然你问它是否可能,我认为它可以通过聚合来实现,但是这可能很棘手。
db.feedback.aggregate([
{$project : {
'outletId' : 1,
'feedback._id' : '$_id',
'feedback.createdOn' : '$createdOn',
'feedback.a' : '$a'
}},
{$group : {
_id : $outletId,
feedbacks : {$addToSet : '$feedback'}
}},
{$match : {
'feedbacks.createdOn' : {
$gte : ISODate('2013-05-03')}
}},
{$unwind : '$feedback'}]);
您可以在最后添加一个 $project 阶段,将子对象转换为文档中的值。我知道它看起来不好看,但我会逐步解释它,
首先我们投影一个文档,将所有需要的字段放在一个名为反馈的子字段中,
在第二阶段,我们按 outletId 对其进行分组,并将所有子反馈放入一个名为 feedbacks 的数组中(因此对于每个 outletid,我们都会获得所有反馈)。
在第三阶段,我们使用 $match 过滤掉数组中甚至没有一个 createdOn 字段大于设置日期的反馈,
过滤掉这些 outletId 后,我们调用 unwind 将反馈数组中的每个子项作为单个文档获取。
现在,如果我们谈论 mongoTemplate,是的,它接受所有这些聚合参数,包括在第一阶段的反馈中嵌套子项。看看 TypedAggregation
的一些例子如果您将 createdOn 字段保存为字符串而不是时间戳或 ISODate,即使正常的 mongo 查询在您需要查找范围时也无法处理它,因为它在您的 postgres 示例中有效。
希望对您有所帮助。