如何在mongodb集合中拼接和排序嵌套列表?

时间:2013-04-27 09:54:57

标签: mongodb

我有以下文件:

{
    "_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个注释,但不应用所需的排序。

1 个答案:

答案 0 :(得分:2)

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

如果要对返回文档的某些部分进行排序,唯一的方法是使用aggregation framework

构建类似于此的管道:

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

您可以选择添加$group将结果集分组回单个文档。