2014-01-05 99 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? javascript的答案會做,python的實現會更好。

回答

2

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

理論上你可以在一個大的查詢中完成這一切,但我真的很喜歡分手甚至是複雜的查詢。這種方法的好處在於,如果它不起作用,那麼每個函數都有一套非常簡單的語義,因此您可以單獨調試它們。

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

改進的歡迎!

2

看起來你可以強制整個文件轉換成字符串,然後對搜索:

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

這種解決方案並不覺得華而不實的其他規定,但速度要快得多,我並且迄今爲止提供了相同的結果。

相關問題