如何在环回中限制include-filter的关系记录?

时间:2017-02-22 09:15:58

标签: loopbackjs strongloop loopback

我想通过REST-Api从 LoopBack - 应用程序查询特定模型的记录。另外,我想通过include-filter包含相关对象。 这很好,但返回所有相关的对象。是否可以限制它们,还可以通过相关对象的字段对它们进行排序?

型号:

-   DEPARTMENT
    Fields:
        - id
        - name 
        - ...
    Relations_ -> hasMany: Messages
    Relations_ -> hasMany: Members

- MESSAGE
    Fields:
       - id
       - senderId
       - body
       - ...

- MEMBER
    Fields:
       - id
       - email
       - ...

查询:

我想要实现的是查询所有部门及其所有成员,但只查询特定字段(created-timestamp)排序的最后一条消息。

第一种方法可能是GET-Request的普通查询字符串变体:

http://loopback-server:3000/api/departments?filter[include]=members&filter[include]=messages

这将返回包含所有消息和所有成员的所有部门。但是,我想将返回的消息数量限制为最后一个消息(或者最后5个或者其他消息,按MESSAGE模型的特定字段排序。

我还尝试了jsonfied查询语法:

http://loopback-server:3000/api/departments?filter={"include":{"relation": "messages","limit":1}}

不幸的是,这里没有使用" limit" -parameter来表示消息的关系。

以下变体将仅返回第一个部门,表示limit-param应用于departments-model,而不是关系模型。

http://loopback-server:3000/api/departments?filter={"include":{"relation": "messages"},"limit":1}

然后我发现了范围 - 参数  并尝试了这个:

http://loopback-server:3000/api/departments?filter={"include":{"relation": "messages","scope":{"limit":1, "skip":0}}}

这给出了一个非常奇怪的结果。这省略了与部门相关的所有消息,而不是一条返回一条消息的特定记录(它有超过10条),这是我所期望的。删除scope-parameter表明部门确实每个都有很多消息。

(我知道具有所有这些特殊字符的网址的参数,例如{&#34;,:&#34;}需要进行网址编码。为了更好的可读性,我将其保留在这里干净)< / em>的

我的问题:

如何使用单个请求实现该查询?

4 个答案:

答案 0 :(得分:2)

无法通过其属性(尚)查询关系。至于限制,你应该稍微修改你对范围的最后一种方法:

"scope":{{"include":{"relation": "messages","limit":1, "skip":0}}}

在这里,您可以通过其属性阅读有关关系的查询:

https://github.com/strongloop/loopback/issues/517

答案 1 :(得分:1)

我不知道你在哪个版本,但对于Loopback 3

你可以这样做..

include: {
    {
        relation: 'Messages', // include the messages object
        scope: { // this is where you do a normal filter
            where: {<whatevercondition>},
            order: "<fieldname> <ASC/DESC>",
            limit:1,
            include:{
                //yes, you can include 3rd level relation as well.
            }
        }
    },
    {
        relation: 'Members', // include the Members object
        scope: { // further filter the related model
            order: "<fieldname> <ASC/DESC>",
            limit: <whateverlimityoument>
        }
    }
}

答案 2 :(得分:0)

尝试此代码:

`${urlApi}/user/?filter[limit]=${records_per_page}&filter[skip]=${(currentPage -1) *
                    records_per_page}`

答案 3 :(得分:0)

当您只有一个父记录时,包含范围的限制可以正常工作。 如果您想选择 N 个父记录并在每个记录中包含 1 个相关记录,请尝试我的解决方法:Limit for included records in Loopback4