2

I'm using logical deletes by adding a field deletedAt. If I want to get only the deleted documents it would be something like r.table('clients').hasFields('deletedAt'). My method has a withDeletes parameter which determines if deleted documents are excluded or not.

Finally, people at the #rethinkdb IRC channel suggested me to use the filter method and that did the trick:

query = adapter.table(table).filter(filters)
if withDeleted
    query = adapter.filter (doc) ->
        return doc.hasFields 'deletedAt'
else
    query = adapter.filter (doc) ->
        return doc.hasFields('deletedAt').not()
query.run connection, (err, results) ->
...

My question is why do I have to use filter and not something like:

query = adapter.table(table).filter(filters)
query = if withDeleted then query.hasFields 'deletedAt' else query.hasFields('deletedAt').not()
...

or something like that.

Thanks in advance.

4

2 回答 2

2

hasFields函数可以在对象和序列上调用,但不是不能

这个查询:

query.hasFields('deletedAt')

行为与此相同(在对象序列上):

query.filter((doc) -> return doc.hasFields('deletedAt'))

但是,此查询:

query.hasFields('deletedAt').not()

行为如下:

query.filter((doc) -> return doc.hasFields('deletedAt')).not()

但这没有意义。你希望在not里面filter,而不是在它之后。像这样:

query.filter((doc) -> return doc.hasFields('deletedAt').not())
于 2013-12-14T19:24:17.033 回答
1

RethinkDB 的一个优点是,由于查询是在宿主语言中构建的,因此只需在您的语言中定义函数,就可以很容易地定义新的流畅语法。例如,如果您想拥有一个缺少字段的函数,您可以在 Python 中定义它(对不起,我不太了解 coffeescript),如下所示:

def lacks_fields(stream, *args):
    res = stream
    for arg in args:
        res = res.filter(lambda x: ~x.has_fields(arg))
    return res

然后你可以使用一个很好的流利的语法,比如:

lacks_fields(stream, "foo", "bar", "buzz")
于 2013-12-15T08:27:12.530 回答