如何在两个子选项上使用动态键对 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 });
但是,对于您当前的模式,所有这些逻辑都需要在您的应用程序中,并且会变得混乱。一种可能的解决方案是获取所有文档,并在遍历游标时,对于每个文档,遍历键,将它们添加到数组中。数组中包含所有子文档后,根据 votes
和 added
.
对数组进行排序
这是可能的,但不必要地复杂。当然,您将无法利用索引,这会对您的性能产生影响。
您已经在子文档中包含了 key
,所以我真的建议您重新考虑您的架构。
我正在尝试在 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 });
但是,对于您当前的模式,所有这些逻辑都需要在您的应用程序中,并且会变得混乱。一种可能的解决方案是获取所有文档,并在遍历游标时,对于每个文档,遍历键,将它们添加到数组中。数组中包含所有子文档后,根据 votes
和 added
.
这是可能的,但不必要地复杂。当然,您将无法利用索引,这会对您的性能产生影响。
您已经在子文档中包含了 key
,所以我真的建议您重新考虑您的架构。