RethinkDB:​​获取任何字段中包含字符串的所有文档

问题描述:

我想要执行一个查询,它将返回包含任何字段中给定字符串的所有文档。例如,假设我有一个“用户”的表,我期待所有包含“约翰”的文件,返回的结果可能是:RethinkDB:​​获取任何字段中包含字符串的所有文档

[{"first_name": "jhon", "last_name": "watson"}, {"first_name": "elton", "last_name": "john"}, {"first_name": "sherlock", "last_name": "holmes", "best_friend": "john watson"}]

我该怎么做,在rethinkdb? javascript的答案会做,python的实现会更好。

不幸的是,由于ReQL没有像Python这样的values函数,所以这个查询更加困难。然而,它确实有一个keys功能,所以我们只是用它来制作一个values功能,像这样:

def values(doc): 
    return doc.keys().map(lambda x: doc[x]) 

现在我们有一个发现,包含其键的一个字符串的文件是很容易的:

def has_str(doc, str): 
    return values(doc).map(match(str)).reduce(lambda x,y: x | y) 

最后,我们可以把它放在一起:

r.table("users").filter(lambda doc: has_str(doc, str)) 

理论上你可以在一个大的查询中完成这一切,但我真的很喜欢分手甚至是复杂的查询。这种方法的好处在于,如果它不起作用,那么每个函数都有一套非常简单的语义,因此您可以单独调试它们。

对于任何人谁发现自己在这里试图在JavaScript摸不着头脑,这大致翻译为:

function values(doc) { 
    return doc.keys().map(function(key) { 
    return doc(key); 
    }); 
} 

function contains(doc, string) { 
    return values(doc).map(function(val) { 
    return r.branch(val.match(string), true, false); 
    }).reduce(function(left, right) { 
    return left.or(right); 
    }); 
} 

var query = r.db('database').table('table').filter(function(doc) { 
    return contains(doc, "some string"); 
}); 

query.run().then(function(results) { 
    console.log(results); 
}); 

改进的欢迎!

看起来你可以强制整个文件转换成字符串,然后对搜索:

r.db('database').table('table).filter(function(doc) { 
    return doc.coerceTo('string').match('querystring'); 
}); 

这种解决方案并不觉得华而不实的其他规定,但速度要快得多,我并且迄今为止提供了相同的结果。