hasFields的反义词是什么?

时间:2013-12-14 18:44:30

标签: coffeescript rethinkdb

我通过添加字段deletedAt来使用逻辑删除。如果我只想获取已删除的文档,那就像r.table('clients').hasFields('deletedAt')。我的方法有一个withDeletes参数,用于确定是否排除已删除的文档。

最后,#rethinkdb IRC频道的人建议我使用filter方法,这样就可以了:

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) ->
...

我的问题是为什么我必须使用filter而不是像:

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

或类似的东西。

提前致谢。

2 个答案:

答案 0 :(得分:2)

可以在对象和序列上调用hasFields函数,但not不能。{/ p>

此查询:

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()) 之后。像这样:

{{1}}

答案 1 :(得分:1)

关于RethinkDB的一个好处是,由于查询是以宿主语言构建的,因此只需用您的语言定义函数就可以很容易地定义新的流畅语法。例如,如果你想拥有一个lacksFields函数,你可以在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")