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');
});
这种解决方案并不觉得华而不实的其他规定,但速度要快得多,我并且迄今为止提供了相同的结果。