0

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

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

Это возможно даже в MongoDB?

+0

Как этот запрос отличается от 'select * from feedback где feedback.createdOn> = '2013-05-03' :: date, видя, что вы запрашиваете из одной таблицы,' feedback'? – chridam

+0

ваш запрос возвращает обратные связи, созданные по истечении заданного времени. Я хочу, чтобы все отзывы (даже если они были сделаны до заданного времени) торговых точек, у которых по крайней мере одна обратная связь создана после заданного времени. –

ответ

0

Ну, в MongoDB нет концепции внутренних запросов, поэтому в основном это может быть достигнуто с помощью двух запросов, но, вероятно, вы уже знаете это и хотите «лучшее» решение. Поскольку вы спросили, возможно ли , я думаю, что это может быть достигнуто путем агрегации, однако это может быть сложно.

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'}]); 

В конце вы можете добавить еще один этап проекта $, чтобы превратить дочерний объект в значения, как это было в документе. Я знаю, что это не выглядит красиво, но я бы объяснить это поэтапно,

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

на втором этапе мы сгруппировали его by outletId и поместить всю обратную связь с дочерними элементами в массив с именем обратной связи (так что для каждого выхода мы получаем все обратные связи).

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

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

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

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

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