使用mongo模板的内部查询

时间:2017-01-25 14:02:06

标签: mongodb mongodb-query aggregation-framework spring-mongo mongotemplate

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

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

这在MongoDB中是否可行?

1 个答案:

答案 0 :(得分: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阶段,将子对象转换为文档中的值。我知道它看起来不漂亮,但我会逐步解释它,

首先我们投射一个文档,将所有需要的字段放在名为feedback的子字段中,

在第二阶段,我们按照outletId对其进行分组,并将所有子反馈放入一个名为feedbacks的数组中(因此对于每个outletid我们都会得到所有反馈)。

在第三阶段,我们使用$ match来过滤数组中哪一个甚至没有一个反馈,其中createdOn字段大于设定日期,

在这些outletIds被过滤掉后,我们调用unwind来将每个反馈数组中的子项作为单个文档。

现在,如果我们谈论mongoTemplate,是的,它接受所有这些参数用于聚合,包括在第一阶段的反馈中嵌套子。只看一些 TypedAggregation

的例子

如果您将createdOn字段保存为字符串而不是时间戳或ISODate,即使正常的mongo查询在您需要找到作为其在postgres示例中工作的范围时也不会对其进行处理。

希望它有所帮助。