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

Rethinkdb RejectDB:获取任何字段中包含字符串的所有文档,rethinkdb,rethinkdb-python,Rethinkdb,Rethinkdb Python,我想执行一个查询,该查询将返回在任何字段中包含给定字符串的所有文档。例如,假设我有一个“users”表,我正在查找包含“john”的所有文档,返回的结果可以是: 我该怎么做呢?javascript回答就可以了,python实现会更好。不幸的是,由于ReQL没有像python那样的值函数,这个查询变得更加困难。但是,它确实有一个键函数,所以让我们用它来创建一个值函数,如下所示: def values(doc): return doc.keys().map(lambda x: doc[x]

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


我该怎么做呢?javascript回答就可以了,python实现会更好。

不幸的是,由于ReQL没有像python那样的
函数,这个查询变得更加困难。但是,它确实有一个
函数,所以让我们用它来创建一个
函数,如下所示:

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))


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

不幸的是,由于ReQL没有像python那样的
value
函数,因此这个查询变得更加困难。但是,它确实有一个
函数,所以让我们用它来创建一个
函数,如下所示:

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);
});

欢迎光临

对于那些在这里试图用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');
});

此解决方案感觉没有提供的其他解决方案那么流畅,但对我来说运行得更快,并提供了迄今为止相同的结果。

看起来您可以将整个文档强制转换为字符串,然后在该字符串上搜索:

r.db('database').table('table).filter(function(doc) {
  return doc.coerceTo('string').match('querystring');
});
这个解决方案感觉不像提供的其他解决方案那么流畅,但对我来说运行得更快,并且迄今为止提供了相同的结果