【问题标题】:Meteor: How to sort documents by the first item of an arrayMeteor:如何按数组的第一项对文档进行排序
【发布时间】:2016-02-02 22:45:15
【问题描述】:

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

我提出了 map、reduce 和 aggregate 的概念,但不知道如何分别在这里应用以及是否有必要。

或者也许 Meteor 有包或“技巧”?

非常感谢任何帮助。

【问题讨论】:

    标签: javascript json mongodb sorting meteor


    【解决方案1】:

    假设您始终拥有至少一位作者,您可以执行以下操作:

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

    【讨论】:

    • 这就是轨道,谢谢! :) 唯一的小问题:它的排序如下: 第一名:Dada Zetty 和 Amir Aaron 第二名:Dada Zetty。如果首先显示一个作者的论文会更好。有什么想法吗?
    【解决方案2】:
    db.publications.find({}).sort({"authors.lastName":-1})
    

    工作得很好。它首先对文档中的authors 数组进行排序,选择第一个元素,然后对文档进行排序。 Documentation.

    【讨论】:

    • 可以,但它首先对多位作者的论文进行排序,然后是两位作者,然后是一位作者
    • 澄清一下,它只发生在具有相同“最大”作者的文档中。您可能需要将此“二级排序”要求添加到问题中,但恐怕聚合是实现此目的的唯一方法。
    【解决方案3】:

    通过 aggregate() 方法使用 aggregation framework 的另一种替代方法,您可以对作者数组以及文档进行排序。虽然 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);
    

    【讨论】:

    • 看起来不错,但对我来说太复杂了:(也许几个月后。这样做有什么好处而不是@corvid的方式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2015-05-07
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多