Meteor:如何按数组的第一项对文档进行排序

时间:2016-02-02 14:07:23

标签: javascript json mongodb sorting meteor

研究论文应按作者的姓氏排序。这就是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}无济于事。

我出现了地图,缩小和汇总的概念,但不知道如何在这里申请,如果有必要,也分别知道。

或许Meteor有包裹或"技巧"那个?

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

完美无缺。它首先在文档中对authors数组进行排序,选择第一个元素,然后对文档进行排序。 Documentation

答案 2 :(得分:1)

通过 aggregation framework 方法使用 aggregate() 的另一种方法,您可以对作者数组以及文档进行排序。虽然meteor中还不支持 aggregate() ,但您需要安装聚合框架包 - 它不会做任何想象,只需为您包装一些Mongo方法。

只是流星添加 meteorhacks:aggregate ,您应该开展业务。这将为Meteor添加适当的聚合支持。

现在您需要运行此管道以获得所需的结果:

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);