【问题标题】:How to limit records of relations with include-filter in loopback?如何限制环回中包含过滤器的关系记录?
【发布时间】:2017-07-12 05:59:44
【问题描述】:

我想通过 LoopBack 应用程序中的 REST-Api 查询来自特定模型的记录。我还想通过包含过滤器包含相关对象。 这工作正常,但返回所有相关对象。是否可以限制它们并通过相关对象的字段对其进行排序?

型号:

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

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

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

查询:

我想要实现的是查询所有部门及其所有成员,但只查询由特定字段排序的最后一条消息(创建时间戳)。

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

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

这将返回所有部门以及所有消息和所有成员。但是,我想将返回消息的数量限制为最后一条(或最后 5 条或其他任何内容,按 MESSAGE-model 的特定字段排序。

我也试过jsonfied查询语法:

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

不幸的是,这里没有使用“limit”参数来表示消息的关系。

以下变体将仅返回第一个部门,意味着限制参数应用于部门模型,而不是关系模型。

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

然后我发现了 scope 参数 并尝试了这个:

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

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

(我知道带有所有这些特殊字符(如 {",:"} >

我的问题:

如何通过单个请求实现该查询?

【问题讨论】:

标签: loopbackjs strongloop loopback


【解决方案1】:

目前还不能通过属性查询关系。至于限制,应该稍微修改一下您最后使用范围的方法:

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

您可以在此处阅读有关按属性查询关系的信息:

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

【讨论】:

  • 不敢相信!
【解决方案2】:

我不知道你使用的是什么版本,但对于 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>
        }
    }
}

【讨论】:

  • 我怎样才能为belongTo关系添加跳过限制?@Mark Ryan Orosa @Undrium
  • 抱歉,我不太清楚您添加“跳过限制”是什么意思。
  • 我的意思是,我想实现基于嵌入记录的分页(belongTo)@Mark
【解决方案3】:

试试这个代码:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-24
      • 2012-10-10
      • 2018-05-19
      • 1970-01-01
      • 2015-07-26
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多