2010-12-06 35 views
4

我使用CouchDB挺新的,我需要一點點的支持。CouchDB的情況下,敏感的,或選項,如在MySQL

在MySQL中我可以簡單地運行此查詢:

SELECT `name`, `id`, `desc` FROM `table` 
WHERE `name`="jack" OR `cat` LIKE "%|52224|%"; 

這裏是我的兩個問題:

我開始創建一個視圖(仍然沒有像期權和一切):

function(doc) { 
    emit([doc.name, doc.cat], { 
"name" : doc.name, 
"desc" : doc.desc, 
"id" : doc._id 
}); 
} 

1.當我使用「emit([doc.name」)時,字符串必須匹配100%(也區分大小寫)
- >如何使這個選項的情況下未sesnsitive?
我可以在MySQL的要求("Jack, jack, jAck, JAck,...)什麼樣的?

2.如何創建或選項?

當我使用[doc.name, doc.cat],我還被迫要求都瓦爾。
但是,當我只是其中之一,
我怎麼能不創建每個選項的自己的看法查詢?

回答

8

要實現你只需要轉換鍵爲小寫區分大小寫的搜索:

emit([doc.name.toLowerCase(), doc.cat.toLowerCase()])

現在,如果您將您的查詢,以小寫你必須區分大小寫的匹配。 這種解決方案的問題是,如果你要區分大小寫,並且不區分大小寫的搜索,你可以同時發射值:
[doc.name.toLowerCase(), doc.name, doc.cat]
和使用startkey和endkey篩選結果,或創建一個單獨的視圖。


第二個問題是實施起來有點棘手。
首先,如果你需要doc.name僅過濾您可以用startkey=["jack",0]endkey=["jack",'zzzzzz']發送請求將返回所有文件與doc.name="jack"doc.cat0'zzzzzz'之間(有可能是一種更好的方式說「任何貓」 ,不幸的是我現在找不到它)。
如果你需要一個真正的OR,那麼你就應該發出兩行對每個文檔:
emit(doc.name, doc); emit(doc.cat, doc);

這樣,您就可以發佈您的要求所需的密鑰:{"keys": ["jack", "cat_name"]}
這將返回所有的文件與任何"jack" OR "cat_name"鍵。但是,同時擁有這兩個文檔的文檔將被返回兩次,因此您必須在應用程序代碼中過濾重複項。


您還可以使用couchdb-lucene,這將解決您的兩個問題,可能更多。它是couchdb用戶實現高級查詢的流行選擇。

+0

非常感謝,所以你會推薦我更多地創建2個視圖和查詢2次或發射2次?謝謝! – heuri 2010-12-07 10:20:35

相關問題