我有一个简单的音乐数据库,其中包含有关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我可以输入一个包含“艺术家”或“标题”的SortName字段,但希望避免将其直接放入文档中。
发布于 2016-11-05 17:09:19
如果您希望在大型数据集中进行有效的排序,并且在OLTP样式的工作负载中提供查询,那么物化排序键是您的最佳选择,因为您可以在其上放置一个索引。MongoDB排序运算符本机不支持ad用户定义的排序键.
如果查询可以花费更多时间(例如用于分析),则可以使用MongoDB的聚合框架,特别是这两个操作符:
使用这些,您的排序查询可以编写为:
db.music.aggregate([
{ $project:
{ "Artist": 1,
"Title": 1,
"ReleaseYear": 1,
"SortName": { "$ifNull" : [ "$Artist", "$Title" ] },
}
},
{ $sort: { "SortName": 1, "ReleaseYear": 1} }
]);您可以添加任何附加的管道步骤,例如,首先过滤数据($match)。
https://stackoverflow.com/questions/40434158
复制相似问题