2013-10-02 39 views
0

我從這個couchbase博客中得到的示例似乎暗示我需要在nosql中循環搜索,在我看來,搜索數百萬個文檔時效率低下且危險。我誤解了嗎?任何建議?如何做一個簡單的普通SQL查詢轉換:將MYSQL查詢轉換爲Couchbase NoSQL?

那麼,我該如何做到這一點在couchbase nosql語言正確的方式?

查詢例如:

select * from users where loginname='xxx' and passwd='yyy' 

NOSQL/couchbase例如:

實現這一點的
function (doc, meta) { 
    if (doc.ingredients) { 
    for (i=0; i < doc.user.length; i++)                {                           if (doc.user[i].loginname != null) 
     { 
     emit([doc.user[i].loginname , doc.loginname], null); 
     } 
    } 
    } 
} 
+0

我對你的示例有點困惑。 '文檔。loginname'在root以及'doc.user items'中?無論如何。如果用戶信息嵌入爲數組,則需要循環它們以輸出「用戶名」。在view-key中輸出'username'還不夠,然後你爲用戶做了一個簡單的'GET'並且匹配了'pwd'如果你得到了一個匹配?此外,它不會每次都運行。這是創建索引的增量過程。 – Daniel

回答

1

的一種方式,在Couchbase 2.x中,將發射在索引中的登錄名和密碼,並做一個確切的關​​鍵搜索。因爲我不知道你的JSON文件的結構,我將只是體貼的用戶名和密碼是您的文檔的兩個屬性(DOC參數)

function (doc, meta) { 
    emit([doc.loginname , doc.password], null); 
} 

然後你就可以搜索使用下面的查詢文檔(我使用REST API,你將不得不使用你選擇的客戶端SDK做

?key=["username_to_check","password_to_check"] 

注意:不要猶豫,加入你的文件(S)結構的更多信息,以幫助STOF用戶正確回答問題。


開發者預覽版

如果你是一個技術的早期採用者我想請你去看看那個Couchbase是構建下一代查詢語言: http://www.couchbase.com/communities/n1ql

在這種情況下,查詢將看起來像

SELECT * 
    FROM contact-bucket 
    WHERE loginname = "username" 
    AND password = "password" 
0

我不確定您的示例是真實案例,還是僅僅瞭解CB的工作方式。 但我認爲你應該儘量避免在這種情況下使用視圖。

它似乎是你正在做的登錄搜索。如果您查詢的目的,你確實可以這樣發出的用戶名和密碼:

function (doc, meta) { 
    emit([doc.loginname , doc.password], null); 
} 

首先,如果你使用的視圖,你應該不會發射密碼,只需登錄名。

function (doc, meta) { 
    emit([doc.loginname], null); 
} 

然後在您的應用程序中手動驗證密碼。

但最後你根本不應該使用任何視圖。 你應該做的是讓你的文檔的關鍵是用戶名(或確定性的東西),只是執行一個簡單的GET。

查看是偉大的,但真正沉重的CB。您應該首先嚐試查看您是否無法爲您的模式建模,以便不必使用它們,然後如果卡住,則創建一個視圖。