2016-05-31 46 views
2

我试图学习如何使用lambda函数解决冲突插入到表rethinkdbpython表中时,就像这个page上的最后一个示例。我想比较old_docnew_doc之间的timestamp字段,并保留更新的文档。RethinkDB插入和冲突解决函数语法

r.table(import_table).insert(documents, conflict=lambda id, old_doc, new_doc: new_doc if new_doc['timestamp'] > old_doc['timestamp'] else old_doc).run()``` 

这提供了以下错误

rethinkdb.errors.ReqlQueryLogicError: Expected type DATUM but found FUNCTION

我无法找到这个错误多文档或使用lambda函数解决冲突。运行简单的东西,如:

r.table(import_table).insert(documents, conflict=lambda id, old_doc, new_doc: new_doc).run() 

给出了一个让我觉得我不是正确写这同样的错误。任何帮助,将不胜感激。

回答

1

在我看来,你只是寻找r.branch

r.table(import_table).insert(
    documents, 
    conflict=lambda id, old_doc, new_doc: r.branch(
     new_doc['timestamp'] > old_doc['timestamp'], 
     new_doc, 
     old_doc 
    )  
).run() 

在套管冲突,insert预计基准,你只是返回一个函数(拉姆达)。在这里,冲突解决lambda将返回比较的结果,这次将是一个数据。

编辑:

我只是尝试它在数据资源管理器中的JavaScript,和它的作品对我来说:

r.table('foo').insert(
    [{id: 0, a: 3}, {id: 1, a: 2}], 
    { 
    conflict: function(id, old_doc, new_doc){ 
    return r.branch(
     old_doc('a').lt(new_doc('a')), 
     new_doc, 
     old_doc 
    )} 
    }) 

这似乎是比Python语法我上面给的一样,没有?

+0

即使使用'r.branch',我也会得到相同的错误。 – chacalle

+0

我刚刚将您的示例粘贴到数据资源管理器中,并返回与上述相同的错误。 – chacalle

1

用于插入的冲突函数在rethinkdb 2.3.0中实现,因此在更新到该版本或更新版本后可以使用。