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

Posted

技术标签:

【中文标题】RethinkDB:​​获取在任何字段中包含字符串的所有文档【英文标题】:RethinkDB: Getting all documents that contain a string in any field 【发布时间】:2014-01-05 14:07:35 【问题描述】:

我想执行一个查询,该查询将返回在其任何字段中包含给定字符串的所有文档。例如,假设我有一个“users”表,我正在查找所有包含“john”的文档,返回的结果可以是:

["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实现会更好。

【问题讨论】:

【参考方案1】:

不幸的是,由于 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))

理论上,您可以在一个大查询中完成所有这些操作,但我真的很喜欢分解中等复杂的查询。这种方法的真正好处是,如果它不起作用,每个函数都有一组非常简单的语义,因此您可以单独调试它们。

【讨论】:

【参考方案2】:

看起来你可以将整个文档强制转换成一个字符串,然后在上面搜索:

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

这个解决方案感觉不像提供的其他解决方案那样流畅,但对我来说运行得更快,并且提供了迄今为止相同的结果。

【讨论】:

【参考方案3】:

对于发现自己在这里试图用 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);
);

欢迎改进!

【讨论】:

以上是关于RethinkDB:​​获取在任何字段中包含字符串的所有文档的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select 语句获取字符串中包含一个或多个值的所有记录

获取结构中包含此字段的所有表和视图

RethinkDB:​​根据过滤字段过滤文档

如何在 MongoDb 驱动程序的列表中包含特定字段

如何评估访问查询中另一个字段中包含的字段名称?

RethinkDB:​​更新文档