按数组长度排序

时间:2014-05-30 11:29:56

标签: mongodb

如何按数组字段的元素数量对查询进行排序?

假设我有像

这样的记录
{
 title: '',
 author: '',
 votes: [id,id,id]
}

我想按照数组投票的长度排序

3 个答案:

答案 0 :(得分:14)

在MongoDB 2.6及更高版本的$size运算符的帮助下使用聚合框架:

db.collection.aggregate([
    // Project with an array length
    { "$project": {
        "title": 1,
        "author": 1,
        "votes": 1,
        "length": { "$size": "$votes" }
    }},

    // Sort on the "length"
    { "$sort": { "length": -1 } },

    // Project if you really want
    { "$project": {
        "title": 1,
        "author": 1,
        "votes": 1,
    }}
])

足够简单。

如果您没有可用的2.6版本,您仍然可以通过更多工作来完成此任务:

db.collection.aggregate([
    // unwind the array
    { "$unwind": "$votes" },

    // Group back
    { "$group": {
        "_id": "$id",
        "title": { "$first": "$title" },
        "author": { "$first": "$author" },
        "votes": { "$push": "$votes" },
        "length": { "$sum": 1 }
    }},

    // Sort again
    { "$sort": { "length": -1 } },

    // Project if you want to
    { "$project": {
        "title": 1,
        "author": 1,
        "votes": 1,
    }}
])

这就是它。

答案 1 :(得分:3)

使用常规查询,您只能按字段值对匹配的文档进行排序。 聚合查询将允许您计算数组的大小并按该值排序。使用聚合的缺点是它可能很慢。

如果您无法使用聚合,则有一种解决方法。您可以创建一个字段(例如voteCount),您可以在其中存储votes数组的大小。然后,您可以在该字段上创建索引并按其对文档进行排序。这种方法的好处是查询速度很快。这种方法的缺点是你需要手动计算数组中项目的数量。

答案 2 :(得分:0)

试试这个:

db.collection.find().sort({votes:-1})

这将找到所有帖子,然后按投票对帖子进行排序。这里 Votes 是一个数组,所以它会按照数组长度降序排序(最喜欢在顶部),因为 -1 里面的 sort( {votes:-1})