无法查询日期范围,每次都没有结果

时间:2019-01-29 16:46:05

标签: node.js graphql prisma

我很难理解为什么我一直从尝试执行的查询中获得0个结果。基本上,我试图仅返回日期范围内的结果。在给定的表上,我有一个createdAt,它是DateTime标量。基本上,这是从Arizona(或graphql,不确定是哪个设置)自动填充的。因此,在任何表上我都有createdAt,它是一个DateTime字符串,代表创建时的DateTime。

这是给定表的模式:

type Audit {
    id: ID! @unique
    user: User!
    code: AuditCode!
    createdAt: DateTime!
    updatedAt: DateTime!
    message: String
}

我查询了此表并返回了一些结果,我将在此处共享它们:

"getAuditLogsForUser": [
      {
        "id": "cjrgleyvtorqi0b67jnhod8ee",
        "code": {
          "action": "login"
        },
        "createdAt": "2019-01-28T17:14:30.047Z"
      },
      {
        "id": "cjrgn99m9osjz0b67568u9415",
        "code": {
          "action": "adminLogin"
        },
        "createdAt": "2019-01-28T18:06:03.254Z"
      },
      {
        "id": "cjrgnhoddosnv0b67kqefm0sb",
        "code": {
          "action": "adminLogin"
        },
        "createdAt": "2019-01-28T18:12:35.631Z"
      },
      {
        "id": "cjrgnn6ufosqo0b67r2tlo1e2",
        "code": {
          "action": "login"
        },
        "createdAt": "2019-01-28T18:16:52.850Z"
      },
      {
        "id": "cjrgq8wwdotwy0b67ydi6bg01",
        "code": {
          "action": "adminLogin"
        },
        "createdAt": "2019-01-28T19:29:45.616Z"
      },
      {
        "id": "cjrgqaoreoty50b67ksd04s2h",
        "code": {
          "action": "adminLogin"
        },
        "createdAt": "2019-01-28T19:31:08.382Z"
      }]

这是我的getAuditLogsForUser模式定义

getAuditLogsForUser(userId: String!, before: DateTime, after: DateTime): [Audit!]!

因此,要进行测试,我希望将所有结果都放在最后一个和第一个之间。

2019-01-28T19:31:08.382Z是最后一个 2019-01-28T17:14:30.047Z是第一个。

这是我的代码,将其插入查询语句:

if (args.after && args.before) {
                where['createdAt_lte'] = args.after;
                where['createdAt_gte'] = args.before;
            }

            console.log(where)

            return await context.db.query.audits({ where }, info);

我在操场上执行此语句

getAuditLogsForUser(before: "2019-01-28T19:31:08.382Z" after: "2019-01-28T17:14:30.047Z") { id code { action } createdAt }

因此,我希望将createdAt_lte(小于或等于)设置为2019-01-28T17:14:30.047Z,并将createdAt_gte(大于或等于)设置为2019-01-28T19:31:08.382Z

尽管我知道有结果,但是我实际上没有任何结果。

我试图在graphql网站上查找有关DateTime标量的一些文档。我从字面上找不到任何东西,但是我在生成的prisma模式中看到了它。它只是定义为Scalar。没什么特别的。我也不认为我会在其他地方定义它。我正在使用Graphql-yoga,如果有什么区别。

(生成的pyramida文件)
scalar DateTime

我想知道它是否真的可以将其当作真正的日期时间来处理?一定是因为它是作为UTC中的DateTime ISO字符串生成的。

这时我很难理解我的问题,也许我需要以其他方式定义它?感谢您的帮助

2 个答案:

答案 0 :(得分:0)

好,所以弄​​清楚这与我使用“ after”和“ before”作为参数变量这一事实有关。我不知道为什么这会完全弄乱一切,但是如果您将此作为参数,它将不会返回任何结果。很奇怪。必须以某种方式抽象一些其他变量,可能是graphql末端的一个错误。

一旦我尝试了一个新的变量名viola,它就会起作用。

答案 1 :(得分:0)

对不起,我在第一封信中误读了您的示例。这是您在操场上尝试过的正确方法吗?

getAuditLogsForUser(
   before: "2019-01-28T19:31:08.382Z",
   after: "2019-01-28T17:14:30.047Z"
  ){ 
  id 
  code { action }
  createdAt 
}

这将无效,因为之前和之后均不涉及时间,而是用于分页的光标。他们期望一个ID。由于id也是字符串,因此此查询不会引发错误,但不会找到任何内容。分页的使用方法如下:https://www.prisma.io/docs/prisma-graphql-api/reference/queries-qwe1/#pagination

我想您要做的是在查询中使用过滤器。为此,您可以使用where参数。查询如下所示:

getAuditLogsForUser(
      where:{AND:[
           {createdAt_lte: "2019-01-28T19:31:08.382Z"},
           {createdAt_gte: "2019-01-28T17:14:30.047Z"}
         ]}
   ) {
     id 
     code { action } 
     createdAt 
}

以下是过滤文档:https://www.prisma.io/docs/prisma-graphql-api/reference/queries-qwe1/#filtering