Внутренний запрос с использованием шаблона монго

Я новичок в MongoDB и Spring mongotemplate. Я хотел бы построить запрос, используя mongotemplate, эквивалент которого в Postgres был бы

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

Возможно ли это вообще в MongoDB?


person Manu Viswam    schedule 25.01.2017    source источник
comment
Чем этот запрос отличается от select * from feedback where feedback.createdOn >= '2013-05-03'::date, учитывая, что вы делаете запрос из одной таблицы, feedback?   -  person chridam    schedule 25.01.2017
comment
ваш запрос возвращает отзывы, которые были созданы после заданного времени. Я хочу, чтобы все отзывы (даже если они были сделаны до указанного времени) торговых точек, у которых есть хотя бы один отзыв, созданный после указанного времени.   -  person Manu Viswam    schedule 25.01.2017


Ответы (1)


Ну, в 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 в конце, чтобы превратить дочерний объект в значения, как это было в документе. Я знаю, что это выглядит некрасиво, но я бы объяснил это поэтапно,

сначала мы проецируем документ, помещая все необходимые поля в дочернее поле, называемое обратной связью,

на втором этапе мы сгруппировали его по идентификатору розетки и поместили все дочерние отзывы в массив с именем Feedbacks (таким образом, для каждого идентификатора розетки мы получаем все отзывы).

на третьем этапе мы используем $match, чтобы отфильтровать, где нет ни одного отзыва в массиве, поле createdOn которого больше установленной даты,

после того, как эти выходные идентификаторы отфильтрованы, мы вызываем unwind, чтобы получить каждый дочерний элемент в массиве отзывов как отдельный документ.

Теперь, если мы говорим о mongoTemplate, да, он принимает все эти параметры для агрегирования, включая вложение дочерних элементов в обратную связь на первом этапе. просто посмотрите пример TypedAggregation

если вы сохраняете поле createdOn в виде строки вместо метки времени или ISODate, даже обычные запросы монго не будут работать, когда вам нужно найти диапазон, как это работает в вашем примере postgres.

Надеюсь, поможет.

person Rahul Kumar    schedule 25.01.2017