Search code examples
faunadb

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?


Solution

  • 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")))
    )