MongoDB按其他文档中的属性排序

时间:2017-03-10 03:30:35

标签: node.js mongodb sorting json-api

为了扩展我的node.js应用程序的JSON-API功能,我尝试根据关系(AKA其他文档)对查询进行排序,尽管我不想返回它们。

根据JSON-API documentation

  

author.name的排序字段可用于请求根据name关系的author属性对主要数据进行排序。

E.g。 db.collection('books').find({})返回:

[
    {
        type: "book",
        id: "2349",
        attributes: {
            title: "My Sweet Book"
        },
        relationships: {
            author: {
                data: {
                    type: "authors",
                    id: "9"
                }
            }
        }
    },
    {} // etc ...
]

db.collection('authors').find({id: "9"})返回:

[
    {
        type: "author",
        id: "9",
        attributes: {
            name: "Hank Moody"
        }
    }
]

现在我需要一些方法来做类似的事情 db.collection('books').find({}).sort({"author.name": -1})

我认为我需要将查询转换为聚合,以便我可以使用$lookup运算符,但我不确定如何使用localFieldforeignField。< / p>

db.collection('books').aggregate([
    {$match: {}},
    {$lookup: {from: "authors", localField: "attributes.author.data.id", foreignField: "id", as: "temp.author"}},
    {$sort: {"$books.temp.author.name": -1}},
    {$project: {temp: false}},
])

备注

  • 这将是一个用于获取JSON-API数据的全局函数。
    • 这意味着我们不知道排序键是attribute还是relationship
  • 大多数服务器运行LTS版本并具有 MongoDB 3.2

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。

call加入$lookup集合,然后authors展开$unwind数组,以便在book_author字段和{{{{}} {}上应用$sort 1}}排除删除name字段(仅适用于启动Mongo 3.4版本)。对于较低版本,您必须包含要保留的所有其他字段,并在$project阶段排除book_author字段。

book_author