我有一个简单的音乐数据库,其中包含有关CD(艺术家,专辑标题,发行年份等)的信息。基本上,我想按艺术家排序我的查询,然后按发行年份排序(这很容易),但在CD没有艺术家的情况下,我希望在关键字标题上输入。
例如,对于以下CD:
> db.music.find()
{ "_id" : ObjectId("581d3e073a4d1f0d73a8650b"), "Type" : "CD", "Artist" : "Korn", "Title" : "Korn", "ReleaseYear" : 1994 }
{ "_id" : ObjectId("581d3e283a4d1f0d73a8650c"), "Type" : "CD", "Artist" : "Korn", "Title" : "Life is Peachy", "ReleaseYear" : 1996 }
{ "_id" : ObjectId("581d3efd3a4d1f0d73a8650d"), "Type" : "CD", "Title" : "Big Daddy", "ReleaseYear" : 1999 }
{ "_id" : ObjectId("581d3f3c3a4d1f0d73a8650e"), "Type" : "CD", "Title" : "Aerosmith", "ReleaseYear" : 1973, "Artist" : "Aerosmith" }
我希望它分类为:
Aerosmith - Aerosmith (1973)
Big Daddy (1999)
Korn - Korn (1994)
Korn - Life is Peachy (1996)
以下是我的尝试:
> db.music.find().sort({[Artist:1,Title:1],ReleaseYear:1})
2016-11-04T22:10:39.317-0400 E QUERY [thread1] SyntaxError: missing ] in computed property name @(shell):1:29
> db.music.find().sort({[Artist,Title]:1,ReleaseYear:1})
2016-11-04T22:10:50.564-0400 E QUERY [thread1] SyntaxError: missing ] in computed property name @(shell):1:29
> db.music.find().sort({{Artist:1,Title:1},ReleaseYear:1})
2016-11-04T22:11:12.040-0400 E QUERY [thread1] SyntaxError: invalid property id @(shell):1:22
我 COULD 放入包含艺术家或标题的SortName
字段,但希望避免直接将其放入文档中。
答案 0 :(得分:1)
如果您希望排序在大型数据集上有效并且您在OLTP样式的工作负载中提供查询,则物化排序键是您的最佳选择,因为您可以在其上放置索引以进行排序。 MongoDB排序运算符本身不支持临时的,用户定义的排序键。
如果查询可以消耗更多时间,例如对于分析,您可以使用MongoDB的aggregation framework,特别是两个运算符:
使用这些,您的排序查询可以写成:
db.music.aggregate([
{ $project:
{ "Artist": 1,
"Title": 1,
"ReleaseYear": 1,
"SortName": { "$ifNull" : [ "$Artist", "$Title" ] },
}
},
{ $sort: { "SortName": 1, "ReleaseYear": 1} }
]);
您可以向此添加任何其他pipeline steps,例如,首先过滤数据($match
)。