2

我想执行一个查询,该查询将返回在其任何字段中包含给定字符串的所有文档。例如,假设我有一个“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实现会更好。

4

3 回答 3

2

不幸的是,由于 ReQL 没有values像 python 这样的函数,这个查询变得更加困难。但是它确实有一个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))

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

于 2014-01-05T20:24:03.390 回答
2

看起来您可以将整个文档强制转换为字符串,然后对其进行搜索:

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

这个解决方案不像其他提供的那样光滑,但对我来说运行得更快,并且到目前为止提供了相同的结果。

于 2015-05-11T14:10:04.857 回答
0

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

欢迎改进!

于 2015-05-07T23:33:22.050 回答