首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在MongoDB中的多个字段上键入单个排序?

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

Stack Overflow用户
提问于 2016-11-05 02:22:44
回答 1查看 401关注 0票数 0

我有一个简单的音乐数据库,其中包含有关CD的信息(艺术家,专辑标题,发行年份等)。基本上,我想按艺术家排序我的查询,然后发布年份(这很容易做),但在CD没有艺术家的情况下,我想排序的专辑标题上的键。

例如,对于下列CD:

代码语言:javascript
复制
> 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" }

我想把它整理成:

代码语言:javascript
复制
Aerosmith - Aerosmith (1973)
Big Daddy (1999)
Korn - Korn (1994)
Korn - Life is Peachy (1996)

以下是我尝试过的:

代码语言:javascript
复制
> 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字段,但希望避免将其直接放入文档中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-05 17:09:19

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

如果查询可以花费更多时间(例如用于分析),则可以使用MongoDB的聚合框架,特别是这两个操作符:

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

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

代码语言:javascript
复制
db.music.aggregate([
  { $project:
    { "Artist": 1,
      "Title": 1,
      "ReleaseYear": 1,
      "SortName": { "$ifNull" : [ "$Artist", "$Title" ] },
    }
  },
  { $sort: { "SortName": 1, "ReleaseYear": 1} }
]);

您可以添加任何附加的管道步骤,例如,首先过滤数据($match)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40434158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档