2014-01-05 6 views
2

주어진 필드를 포함하는 모든 문서를 반환하는 쿼리를 수행하려고합니다. 예를 들어, 반환 된 결과가 될 수있다, 나는 "사용자"테이블이 나는 "존"이 포함 된 모든 문서를 찾고 있어요 말 :RethinkDB : 모든 필드에 문자열이 포함 된 모든 문서 받기

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

가 어떻게 rethinkdb에서 그렇게합니까? 자바 스크립트 답변을 할 것입니다, 파이썬 구현이 더 좋을 것입니다.

답변

2

이 쿼리는 ReQL에 python과 같은 values 함수가 없다는 사실 때문에 더욱 어렵습니다. 이제 우리는 키 중 하나에 문자열을 포함하는 문서를 찾는 것은 매우 쉽다는 것을 가지고

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

: 그것은 keys 기능을 가지고있다 그러나 그래서 그냥 values 기능과 같이 할 것을 사용하자

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

당신은 이론적으로이 모든 것을 하나의 큰 쿼리에서 할 수 있지만, 나는 다소 복잡한 쿼리를 파기하는 것을 정말로 좋아합니다. 이 접근법에 대한 정말 좋은 점은 각 함수가 작동하지 않으면 아주 간단한 의미 집합을 가지므로 개별적으로 디버깅 할 수 있다는 것입니다.

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

개선 환영 : 자바 스크립트에서이 문제를 알아 내려고 여기 자신을 발견 한 사람들을위한

2
그냥 문자열로 전체 문서를 강요하고, 그 다음에 검색 할 수 있습니다처럼 보이는

:

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

이 솔루션은 다른 규정과 같은 매끄러운 느낌,하지만 나를 위해 훨씬 더 빨리 실행하지 않습니다 지금까지 동일한 결과를 제공합니다.

관련 문제