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
我有userId
和anonId
。 这些字段的值是对象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 }
您可以通过userId
或anonId
对dateCreated
和$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
这是一个要点