Cannot Clear List with GraphQL - Dgraph execution failed because Got unsupported type for list

How can I clear a list field?

Schema:

type Foo {
   items: [String!]!
}

I want to delete all items from that list without the need to reference them explicitly.

This should do the job

{
  "set": [
    {
      "test_list": ["a", "b", "cd"]
    }
  ]
}
{
  delete {
    <0x9c69> <test_list> * .
  }
}

where 0x9c69 is the uid of insert mutation.

Thank you. I don’t want to use dql though.

1 Like
{
  "delete": {
    "uid": "0x9c6a",
    "test_list": null
  }
}

According to docs
All edges for a predicate emanating from a single node can be deleted at once (corresponding to deleting S P *):

https://dgraph.io/docs/mutations/json-mutation-format/

Again, thank you.

But I think you miss the point here. I’m asking about GraphQL not DQL

You mean the generated HTTP GraphQL API?

yes.

It should be:

mutation {
  updateFoo(input: {
    filter: { has: items }
    remove: { items: null }
  }) {
    numUids
    foo {
      items
    }
  }
}

But that is currently erroring out with

mutation updateFoo failed because Dgraph execution failed because Got unsupported type for list: Foo.items

What is working is set it to a single item being an empty string:


mutation {
  updateFoo(input: {
    filter: { has: items }
    remove: { items: [""] }
  }) {
    foo {
      items
    }
  }
}

Interestingly though, if you are using enums, you cannot provide an empty string, hence no way to remove all without specifically providing all possible values. Alternatively, you could create a custom mutation to do this with lambda and DQL, but that seems out of place for something that should be basic CRUD.

1 Like

I remember that in the past this mutation would completely delete the corresponding field. I.e. afterwards items was set to null (although this is not possible as per schema definition).

Anyhow, thank you for pointing out that is is a bug. I agree.

1 Like

What’s the difference between that and this? :

mutation {
  deleteFoo(filter: { has: items }) {
    msg
    foo {
      items
    }
  }
}

I thought remove just removed the link, not the actual nodes?

J

In the OP, the items are not edges to nodes, rather they are string predicate values in a list. In your code, you are deleting the entire node whereas the OP is about deleting a predicate list from a node while keeping the node itself. This would have been clearer if the example was not so minimal and Foo had other predicates/edges

1 Like

Is this bug being tracked?
I’m trying to update the a list as you suggested here, but I got this error

In my case, Foo.items is a list of another type, something like this:

type Foo {
  items: [FooItem!]
}

type FooItem {
  bar: String
  baz: String!
}