更新 FaunaDB 中的记录时,如何在不传入每个字段和子对象的情况下更新一个字段?

When updating a record in FaunaDB, how do I update one field without passing in every field and subobject?

也许我还没有掌握GraphQL,但我想更新数据库中的复杂记录。我找不到解释这个的文档,它没有使用一个简单的例子。我正在使用 FaunaDB 并尝试在 GraphQL 游乐场中进行测试,然后再在 JS 中实现它。

这是我的架构示例:

type Event {
    name: String!
    email: String!
    eventName: String!
    location: String
    guests: [Guest!]!
    note: String!
    confirmed: Boolean!
    completed: Boolean!
    dateTimeStart: Time
    dateTimeEnd: Time
    sentConfirmation: Boolean!
}

type Guest @embedded {
    email: String!
    rsvp: Boolean
    results: SurveyAnswers
}

type SurveyAnswers @embedded {
    ~ 12 various fields
}

我想更新事件的字段:sentConfirmation,就这样。

我知道事件 ID 以及我想将布尔值更新为什么。

有没有一种方法可以编写一个突变来只传递一个 ID 和更新的布尔值并更改那个单个值,或者我是否需要按字面意思传递整个对象及其所有子对象仅更新了一个顶级字段的对象?

我的第一反应也是:“你试过了吗?”但我立即假设你做到了。您的问题是由于您的所有属性都是强制性的(正如您在属性后面用感叹号 (!) 指定的那样)。因此,更新时也会检查这些字段。可以说,这可能是不必要的,我会问我的同事我们是否不想改变它。

在每种情况下,您都可以通过删除必填字段来 'solve' 您的问题。在那种情况下你可以完美地做到:

# Write your query or mutation here
mutation test {
  createEvent(data: {
    name: "Test",
    email: "test@test.com",
    eventName: "lala"
    note: "I am a note",
    confirmed:true,
    completed:true,
    sentConfirmation: false
  })
  {_id}

}

其次是:

# Write your query or mutation here
mutation test {
  updateEvent(id: "269430330059915782", data:{
    completed:false
  })
  {_id}
}

您文档的布尔 'completed' 字段将被更新。

这应该可以通过调用自动生成的 partialUpdate 突变来实现。您可能没有注意到它,因为它目前仅作为 Schema Preview 功能提供。

这基本上意味着为了启用它,您需要将以下 header 添加到您的 HTTP 请求中:

X-Schema-Preview: partial-update-mutation

请注意,由于此架构预览功能添加了一个新的 自动生成 突变,因此您必须在执行 GraphQL 操作时添加此 header(即发送请求/graphql endpoint), and not when importing the schema (i.e., sending a request agains the /import 端点)。原因基本上是所有自动生成的查询和变更都是在 运行时 派生的,而不是在导入模式时派生的。

现在,如果您已经如上所述添加了 header,当调用一些内省查询以读回模式时(例如 GraphQL Playground 所做的),您应该注意到有一个新的突变字段和新输入 object:

input PartialUpdateEventInput {
  name: String
  email: String
  eventName: String
  location: String
  guests: [PartialUpdateGuestInput!]
  note: String
  confirmed: Boolean
  completed: Boolean
  dateTimeStart: Time
  dateTimeEnd: Time
  sentConfirmation: Boolean
}

type Mutation {
  partialUpdateEvent(id: ID!, data: PartialUpdateEventInput!): Event
}

由于所有字段对于这个新输入 object 都是可选的,您现在应该可以只更新 sentConfirmation 字段:

mutation PartialUpdate {
  partialUpdateEvent(id: "269434161519919634", data: {
    sentConfirmation: true
  }) {
    _id
  }
}

所有未包含在变更中的字段将不受影响。

与 FQL 建立并行,这意味着 GraphQL 的 update 突变将充当 FQL 的 Replace function, and GraphQL's partialUpdate mutation as FQL's Update 功能。

通常,我会创建两种不同的输入类型。在您的情况下,它将是 createEventInputupdateEventInput.

createEventInput 中,所有或大部分字段都是必填的,而在 updateEventInput 中,您可以有更多字段是可选的。但是您需要小心,不要最终用空值更新您的记录,这些字段对于您的内部业务逻辑来说实际上是强制性的。

createEvent(数据:createEventInput){ ...}

更新事件(数据:更新事件输入){ ...}

FaunaDB 为 create*update* 突变创建相似的输入类型。但是您可以创建自己的输入类型,如 FaunaDB docs

中所述