2016-02-02 25 views
2

研究论文应按作者的姓氏排序。这是一个JSON怎么看起来像一个作者:流星:如何按数组的第一项对文档进行排序

{ 
    "_id" : "ADnijjRpoWkTEGgkc", 
    "authors" : [ 
     { 
      "lastName" : "Rahbaran", 
      "firstName" : "Amir" 
     } 
    ], 
    "title" : "Bricolage revisted", 
    "outlet" : "Journal of Strategic Management", 
    "year" : "2017", 
    "abstract" : "dicta sunt explicabo. Nemo enim ..." 
} 

相应的模板助手完美的作品如果只有一个存储作者:

return Publications.find({}, { 
     sort: {"authors.lastName": -1} 
    }).fetch(); 

问题:在许多情况下,您有多个作者单个研究报告:

这将是JSON:

{ 
    "_id" : ObjectId("56b06047204a563ca4207e8e"), 
    "authors" : [ 
     { 
      "lastName" : "Lennon", 
      "firstName" : "John" 
     }, 
     { 
      "lastName" : "McCartney", 
      "firstName" : "Paul" 
     } 
    ], 
    "title" : "The Beatles - revisted", 
    "outlet" : "Journal of Great Music", 
    "year" : "1968", 
    "abstract" : "Ob-La-Di, Ob-La-Da ... " 
} 

现在,我试图sort: {"authors.lastName.0": -1}sort: {"authors.lastName[0]": -1}无济于事。

我出现了地图的概念,减少和聚合,但不知道如何在这里应用,如果它是必要的,分别。

或者也许流星有包装或“诡计”呢?

任何帮助真的很感激。

回答

1

假设你总是有至少一个作者,您可以执行以下操作:

Publications.find({}, { 
    sort: { 
    'authors.0.lastName': -1 
    } 
}); 
+0

这确实轨道,THX! :)只有小问题:它有点像这样:第一:达达Zetty和阿米尔亚伦第二:达达Zetty。如果只有一位作者的论文首先被显示,会更好。有任何想法吗? –

1
db.publications.find({}).sort({"authors.lastName":-1}) 

工作完全正常。它首先在文档内排序authors数组,然后挑选第一个元素,然后对文档进行排序。 Documentation

+0

它确实存在,但是它先将多个作者的论文进行排序,然后与两位作者进行排序,然后与一位作者进行排序 –

+1

仅仅为了阐明,它只发生在具有相同“最大”作者的文档上。您可能需要在问题中添加此“次要排序”要求,但恐怕聚合是实现此目标的唯一方法。 –

1

通过aggregate()方法使用aggregation framework另一种选择,你可以在作者阵列以及文件进行排序。虽然aggregate()目前还不支持流星,你需要安装聚合框架包 - 它不会做任何花哨的事情,只需要为你包装一些Mongo方法。

只是流星添加meteorhacks:aggregate你应该做生意。这将为流星添加适当的聚合支持。

现在你需要运行这个管道达到预期的效果:

var pipeline = [ 
    { "$unwind": "authors" }, 
    { "$sort": { "authors.lastName": -1 } }, 
    { 
     "$group": { 
      "_id": "$authors", 
      "authors": { "$push": "$authors" }, 
      "title": { "$first": "$title" }, 
      "outlet": { "$first": "$outlet" }, 
      "year": { "$first": "$year" }, 
      "abstract": { "$first": "$abstract" } 
     } 
    }, 
    { "$sort": { "authors.lastName": -1 } }, 
]; 

return Publications.aggregate(pipeline); 
+0

看起来不错,但是对我来说太复杂了:(也许在几个月内。是否有任何好处,而不是@corvid的方式? –

相关问题