2016-12-02 22 views
0

我想從Node.js在couchBase上創建用戶特定的視圖。這裏是我的代碼有如何設置輸入變量作爲鍵在json中創建視圖時在couchBase

app.post("/todo/:id", function(req, res){ 
console.log("hey" + req.body.userId) 
    baseview.setDesign('design_users', { 
    "$req.body.userId": { 
     'map': "function (doc, meta) { if(doc.toUserName == req.body.userId) {emit(doc.status, doc.title);}}" 
     } 
    }, 
    function(err, result){ 
     if (err != null) console.log(err); 
     else res.send(result) 
    } 
); 
}) 

在雖然在couchBase創建設計文件design_users執行以下捲曲

curl -H "Content-Type: application/json" -X POST -d '{"userId": "uidam231"}' http://localhost:3000/todo/id 

,預期視圖(uidam231)不是。控制檯上沒有錯誤。

我懷疑在json中變量req.body.userId的分配可能是原因。請注意,視圖名稱(「$ req.body.userId」:)和過濾條件(doc.toUserName == req.body.userId)都需要傳入變量。

有什麼建議嗎?

回答

1

由於map()reduce()用於不查詢數據,而是建立索引,桶中數據的物化視圖,並且以後可以執行,因此無法將變量傳遞給視圖中的映射函數過濾,測距,排序,但基於您在構建期間(即執行映射時)選擇要放入該索引的鍵。如果簡單起見,數據庫將爲整個數據集運行一次map函數,然後爲每個新/更改的文檔更新索引。這就是爲什麼你不能傳遞或使用查詢中的參數,或者在某些情況下它會毫無意義地使用new Date()Math.random(),因爲它們的值在索引構建期間僅對每個文檔評估一次,而不是查詢時間。

,你應該在你的情況下做的,是建立地圖的功能是這樣的:

function (doc, meta) { 
    emit(doc.toUserName, [doc.status, doc.title]); 
} 

這會給你查看索引,其中用戶名是關鍵,和地位,標題是值。這樣您就可以使用key=參數查詢視圖並傳遞用戶標識。

的更多信息:

  1. Querying Data with Views
  2. MapReduce Views
+0

@avsej你好:我理解這部分內容。我想要實現的是這個,讓我們說一個新的用戶註冊,我想添加(用戶特定的)視圖到couchBase。我想我也可以運行腳本來添加基於每個用戶的視圖。基本上,這不是一個查詢。只是一個視圖,map函數檢查某個值,比如說一個數字或字符串。只是從Node.js插入視圖(僅針對每個新註冊用戶一次) – user1384205

+0

在這種情況下,您必須將username替換爲'map()'函數體,而不是'req.body.userId',並且還將其替換爲查看名稱。但是你必須記住,你不能更新/添加單一視圖,你必須每次覆蓋整個設計文檔。也許N1QL會解決你的問題? – avsej

+0

NiQL似乎比視圖具有更高的延遲。我打算用客戶端上的couchbase lite減輕差異。我仍然不能轉換成上述問題中的文字部分。 – user1384205

相關問題