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

How to multi-sort MongoDB entry with dynamic keys, on two suboptions?

我正在尝试在 MongoDB 中使用 mongojs 在 find():

中对此进行排序
{
    "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) {});

但这不起作用。

如果这是您要经常执行的操作,我会强烈考虑更改您的架构。如果将 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,所以我真的建议您重新考虑您的架构。