0

我是 MongoDB 和 Spring mongotemplate 的新手。我想使用 mongotemplate 构建一个查询,它在 Postgres 中的等价物是

select * from feedback 
where feedback.outletId in (
    select outletId from feedback 
    where feedback.createdOn >= '2013-05-03'::date
)

这在 MongoDB 中是否可行?

4

1 回答 1

0

嗯,MongoDB 中没有内部查询的概念,所以基本上它可以通过 2 个查询来实现,但您可能已经知道这一点并想要一个“更好”的解决方案。既然您问是否可能,我认为可以通过聚合来实现,但这可能很棘手。

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,那么当您需要在 postgres 示例中查找范围时,即使正常的 mongo 查询也将无法正常工作。

希望能帮助到你。

于 2017-01-25T17:47:05.900 回答