2017-02-23 106 views
1

我將嘗試使用示例數據進行解釋。用戶可以進行任意數量的評論,但我只想回複評論者的最新評論。查找所有文檔,但是如果某些文檔具有相同的值,請獲取最新的文檔

{ 
    id : 1 
    name : "John", 
    review : "only one review" 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    id : 3 
    name : "Sam" 
    review : "second entered" 
    dateCreated : 2017-02-23 02:41:42.300Z 
} 
{ 
    id : 2 
    name : "Sam", 
    review : "fist enterd" 
    dateCreated : 2017-02-23 02:36:32.150Z 
} 

一個.find()應當與ID 1和ID 3.返回文檔因爲只有一個由John製作和一個id爲3是由薩姆成爲最後一個。

是否有這樣的查詢?

我的實際項目比較難,因爲我沒有name我有userIdanonId。這些字段的值是對象ID。最複雜的部分是文檔不包含兩者。它包含一個userIdanonId

所以我想我會需要一個或條件也許。 anonId或userId

也許你可以給我關於此的想法。

編輯:

我的實際數據看起來更像是這樣的。它更復雜。

{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : review made by an anoymous user 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : second review made by anonymous user 
    dateCreated : 2017-02-23 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : first review made by authenticated user 
    dateCreated : 2017-02-22 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : second review made by authenticated user 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

{ 
    userId : ObjectId("58ae5fc7a467cf23947833c8") 
    review : This will be returened because no other review has this userID 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

回答

1

可以執行降$sortdateCreated$group通過userIdanonId

db.test.aggregate([{ 
    $sort: { 
     "dateCreated": -1 
    } 
}, { 
    $project: { 
     ref: { 
      $cond: { 
       if: { $gt: ["$userId", null] }, 
       then: "$userId", 
       else: "$anonId" 
      } 
     }, 
     document: "$$ROOT" 
    } 
}, { 
    $group: { 
     _id: "$ref", 
     document: { 
      "$first": "$document" 
     } 
    } 
}]) 

注意的是,在$project階段使用的條件是要檢查是否userId存在,否則設置refanonId

Here is a gist

+0

可以說我有20個字段/路徑。我應該第一個爲他們所有人 –

+0

我已經更新了你的真實用例(使用'userId'和'anonId')並且使用'$$ ROOT'作爲嵌套文檔來照顧你所有的字段 –

+0

我認爲這個使得填充'userId'' anonId'字段更加困難。我可以在此之後填充嗎?感謝您的回答。 –

相關問題