如何在两个子选项上使用动态密钥对MongoDB条目进行多重排序?

时间:2015-04-08 18:07:35

标签: mongodb sorting mongojs

我正在尝试使用find()上的mongojs在MongoDB中对此进行排序:

{
    "songs": {
        "bNppHOYIgRE": {
            "id": "bNppHOYIgRE",
            "title": "Kygo - ID (Ultra Music Festival Anthem)",
            "votes": 1,
            "added": 1428514707,
            "guids": [
                "MzM3NTUx"
            ]
        },
        "izJzdDPH9yw": {
            "id": "izJzdDPH9yw",
            "title": "Benjamin Francis Leftwich - Atlas Hands (Samuraii Edit)",
            "votes": 1,
            "added": 1428514740,
            "guids": [
                "MzM3NTUx"
            ]
        },
        "Yifz3X_i-F8": {
            "id": "Yifz3X_i-F8",
            "title": "M83 - Wait (Kygo Remix)",
            "votes": 0,
            "added": 1428494338,
            "guids": []
        },
        "nDopn_p2wk4": {
            "id": "nDopn_p2wk4",
            "title": "Syn Cole - Miami 82 (Kygo Remix)",
            "votes": 0,
            "added": 1428494993,
            "guids": []
        }
    }
}

我希望对votes升序和added降序的歌曲中的键进行排序。

我试过了

db.collection(coll).find().sort({votes:1}, function(err, docs) {});

但这不起作用。

1 个答案:

答案 0 :(得分:1)

如果这是您经常要做的操作,我会强烈考虑更改您的架构。如果您使songs成为数组而不是地图,则可以使用聚合执行此查询。

db.coll.aggregate([{ "$unwind": "$songs" }, { "$sort": { "songs.votes": 1, "songs.added": -1 }}]);

如果您将每首歌曲放在单独的songs集合中,那么您可以使用简单的find()sort()执行查询。

db.songs.find().sort({ "votes": 1, "added": -1 });

但是,使用当前架构,所有这些逻辑都需要在您的应用程序中,它会变得混乱。一种可能的解决方案是获取所有文档,并在迭代光标时,为每个文档迭代键,将它们添加到数组中。获得数组中的所有子文档后,根据votesadded对数组进行排序。

这是可能的,但不必要地复杂。当然,您无法利用会对您的表现产生影响的索引。

您已在子文档中包含key,因此我建议您重新考虑您的架构。