是否可以在MongoDB中的多个字段上键入单个排序?

时间:2016-11-05 02:22:45

标签: mongodb sorting

我有一个简单的音乐数据库,其中包含有关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字段,但希望避免直接将其放入文档中。

1 个答案:

答案 0 :(得分:1)

如果您希望排序在大型数据集上有效并且您在OLTP样式的工作负载中提供查询,则物化排序键是您的最佳选择,因为您可以在其上放置索引以进行排序。 MongoDB排序运算符本身不支持临时的,用户定义的排序键。

如果查询可以消耗更多时间,例如对于分析,您可以使用MongoDB的aggregation framework,特别是两个运算符:

  • $project,允许在汇总管道中创建新字段
  • $ifNull返回非空值(第一个参数)或回退表达式(第二个参数)

使用这些,您的排序查询可以写成:

db.music.aggregate([
  { $project:
    { "Artist": 1,
      "Title": 1,
      "ReleaseYear": 1,
      "SortName": { "$ifNull" : [ "$Artist", "$Title" ] },
    }
  },
  { $sort: { "SortName": 1, "ReleaseYear": 1} }
]);

您可以向此添加任何其他pipeline steps,例如,首先过滤数据($match)。