我通过添加字段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()
...
或类似的东西。
提前致谢。
答案 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")