0

我有以下文件:

{
    "_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 条评论,但不应用所需的排序。

4

1 回答 1

2

您使用的查询针对整个集合,并且排序应用于该集合中的文档。

如果要对返回文档的部分进行排序,唯一的方法是使用聚合框架

构建一个类似这样的管道:

db.collection.aggregate( [ { $match : { <your-find-expression> } }, 
                           { $unwind : "$comments" },
                           { $sort : { "comments.dateCreated" : -1 } },
                           { $limit : 5 }
] );

或者,您可以添加$group以将结果集重新组合到单个文档中。

于 2013-04-27T14:34:10.843 回答