entio
entio

Reputation: 4273

Creating an index for all active items

I have a collection of documents that follow this schema {label: String, status: Number}.

I want to introduce a new field, deleted_at: Date that will hold information if a document has already been deleted. Seems like a perfect use case for an index, to be able to search for all undeleted tasks.

CreateIndex({
  name: "activeTasks",
  source: Collection("tasks"),
  terms: [
    { field: ["data", "deleted_at"] }
  ]
})

And then filter by undefined / null value in shell:

Paginate(Match(Index("activeTasks"), null))
Paginate(Match(Index("activeTasks"), undefined))

It returns nothing, even for documents where I explicitly set deleted_at to null. That's not my point, though. I want to get documents that do not have the deleted_at defined at all, so that I do not have to update the whole collection.

PS. When I add document where deleted: "test" and query for it, the shell does return the expected result.

What do I don't get?

Upvotes: 1

Views: 114

Answers (1)

Vadorequest
Vadorequest

Reputation: 18019

The reason is because FaunaDB doesn't support reading empty/null value the way you think it does. You need to use a special Bindings to do that.

Make sure to check out https://docs.fauna.com/fauna/current/tutorials/indexes/bindings.html#empty for a more thorough explanation and examples.

My understanding of how bindings work would yield the following code. I haven't tested it though and I'm not sure it works.

You need a special binding index:

CreateIndex({
  name: "activeTasks",
  source: [{
    collection: Collection("tasks"),
    fields: {
      null_deleted_at: Query(
        Lambda(
          "doc",
          Equals(Select(["data", "deleted_at"], Var("doc"), null), null)
        )
      )
    }
  }],
  terms: [ {binding: "null_deleted_at"} ],
})

Usage:

Map(
  Paginate(Match(Index("activeTasks"), true)),
  Lambda("X", Get(Var("X")))
)

Upvotes: 2

Related Questions