我有以下文件:
{
"_id"423434234,
"username":"Tom",
"comments":
[
{
"comment":"Hello",
"dateCreated":2342362234523
},
{
"comment":"Hello",
"dateCreated":2342362234523
},
{
"comment":"Hello",
"dateCreated":2342362234523
},
{
"comment":"Hello",
"dateCreated":2342362234523
},
{
"comment":"Hello",
"dateCreated":2342362234523
},
{
"comment":"Hello",
"dateCreated":2342362234523
}
]
}
使用findOne我想通过_id查询文档,只返回dateCreated DESC排序的前5条注释。我试过这个问题:
findOne({"_id":ObjectId("517b9b749451a74ce661fa74")},{"comments":{"$slice":5}},{"$sort":{"comments.dateCreated":-1}})
它返回前5个注释,但不应用所需的排序。
答案 0 :(得分:2)
您使用的查询针对整个集合,并且排序正在应用于该集合中的文档。
如果要对返回文档的某些部分进行排序,唯一的方法是使用aggregation framework。
构建类似于此的管道:
db.collection.aggregate( [ { $match : { <your-find-expression> } },
{ $unwind : "$comments" },
{ $sort : { "comments.dateCreated" : -1 } },
{ $limit : 5 }
] );
您可以选择添加$group
将结果集分组回单个文档。