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 where feedback.createdOn> ='2013-05-03':: date'有什麼不同?看到你正在查詢單個表,'feedback'? – chridam

+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項目階段,以將子對象轉換爲文檔中的值。我知道它看起來並不漂亮,但我會解釋的階段階段,

第一,我們預計與把所有需要的領域被稱爲反饋的子字段內的文檔,

在第二階段

我們分組它通過outletId並將所有孩子的反饋放入一個名爲feedbacks的數組中(所以每個outletid我們都會得到所有的反饋)。

在第三階段

我們使用$匹配過濾掉其中竟然沒有在陣列createdOn場比設定的日期更大的單個反饋,

那些outletIds被過濾掉之後,我們所說的放鬆讓每個孩子在反饋數組中作爲單個文檔。

現在,如果我們談論mongoTemplate,那麼它會在第一階段接受所有這些參數用於聚合,包括兒童反饋中的嵌套。剛纔看到的TypedAggregation

一些例子,如果要保存的createdOn字段作爲一個字符串而不是時間戳或ISODate甚至正常蒙戈查詢是行不通的,當你需要找到範圍及其在你的Postgres例如工作。

希望它有幫助。