find所有的文档,但如果有一些文档具有相同的价值获得最新的一个

我会尝试用样本数据来解释。 用户可以进行任意数量的评论,但是我只想要由评论者返回最新的评论。

{ 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创build的,而id为3的是Sam创build的最后一个。

有没有这个问题?

我的实际项目更困难,因为不是name我有userIdanonId 。 这些字段的值是对象ID。 而最复杂的部分是文档不包含两者。 它包含一个userId或一个anonId

所以我想我可能需要一个或一个条件。 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 } 

您可以通过userIdanonIddateCreated$group执行降序$sort

 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存在,否则设置为anonId

这是一个要点