我正在尝试使用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) {});
但这不起作用。
答案 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 });
但是,使用当前架构,所有这些逻辑都需要在您的应用程序中,它会变得混乱。一种可能的解决方案是获取所有文档,并在迭代光标时,为每个文档迭代键,将它们添加到数组中。获得数组中的所有子文档后,根据votes
和added
对数组进行排序。
这是可能的,但不必要地复杂。当然,您无法利用会对您的表现产生影响的索引。
您已在子文档中包含key
,因此我建议您重新考虑您的架构。