ReQL command: default

Command syntax

value.default(default_value | function) → any
sequence.default(default_value | function) → any

Description

Provide a default value in case of non-existence errors. The default command evaluates its first argument (the value it’s chained to). If that argument returns None or a non-existence error is thrown in evaluation, then default returns its second argument. The second argument is usually a default value, but it can be a function that returns a value.

Example: Retrieve the titles and authors of the table posts. In the case where the author field is missing or None, we want to retrieve the string Anonymous.

r.table("posts").map(lambda post:
    {
        "title": post["title"],
        "author": post["author"].default("Anonymous")
    }
).run(conn)

We can rewrite the previous query with r.branch too.

r.table("posts").map(lambda post:
    r.branch(
        post.has_fields("author"),
        {
            "title": post["title"],
            "author": post["author"]
        },
        {
            "title": post["title"],
            "author": "Anonymous" 
        }
    )
).run(conn)

Example: The default command can also be used to filter documents. Retrieve all our users who are not grown-ups or whose age is unknown (i.e., the field age is missing or equals None).

r.table("users").filter(lambda user:
    (user["age"] < 18).default(True)
).run(conn)

One more way to write the previous query is to set the age to be -1 when the field is missing.

r.table("users").filter(lambda user:
    user["age"].default(-1) < 18
).run(conn)

This can be accomplished with has_fields rather than default.

r.table("users").filter(lambda user:
    user.has_fields("age").not_() | (user["age"] < 18)
).run(conn)

The body of every filter is wrapped in an implicit .default(False). You can overwrite the value False with the default option.

r.table("users").filter(
    lambda user: (user["age"] < 18).default(True),
    default=True
).run(conn)

Example: The function form of default receives the error message as its argument.

r.table("posts").map(lambda post:
    {
        "title": post["title"],
        "author": post["author"].default(lambda err: err)
    }
).run(conn)

This particular example simply returns the error message, so it isn’t very useful. But it would be possible to change the default value based on the specific error message thrown.

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/python/default/