我将尝试用样本数据来解释。用户可以进行任意数量的评论,但我只想返回审阅者的最新评论。
{
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的文档是Sam制作的最后一个文档。
有关于这个的查询吗?
我的实际项目更加困难,因为我使用的是userId和anonId,而不是name。这些字段的值是对象Ids。最复杂的部分是,一个文档不能同时包含这两个部分。它包含userId或anonId
所以我想我可能需要一个or条件。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
}发布于 2017-02-23 12:42:12
您可以通过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是否存在,或者将ref设置为anonId
Here是一个要点
https://stackoverflow.com/questions/42407060
复制相似问题