2012-07-29 60 views
2

我會開始說我做了很多研究,但我仍然很迷茫。CouchDB從Node.js中獲取用戶的所有帖子

我有一個工作版本,但這是我可以做到的最低效率的方式。對於瞭解規劃數據庫的最佳方式,我並不是非常有信心,我已經明確地依賴於ActiveRecord。反正,我只是想弄清楚這些事情:

  1. 找出計劃數據庫(我應該如何分開文件)
  2. 找到最有效的應對關係
  3. 找到最好的方法很好的方法從服務器查詢

好的,所以我注意到一些事情:一,你不能將我的客戶端變量傳遞到視圖,所以使用這樣的方法將無法正常工作。二,我認爲可能會有所有的帖子,然後檢查類型是否發佈,然後返回匹配的文檔,但這似乎有很多數據移動。

一些代碼:

所以我如何使用Node.js,CouchDB的,和納米中間件。

發表文件:

{ 
"_id": "post-slug", 
"title": "Post Slug", 
"user": "film42", 
"date": 1343451412, 
"type": "post" 
} 

用戶文檔:

{ 
"_id": "film42", 
"email": "[email protected]", 
"posts": [ 
    "post-slug", 
    "another-post-slug" 
], 
"type": "user" 
} 

這裏就是我目前獲取所有職位(這是非常糟糕的!):

function buildUserPostArray(array, user, res, i) { 
    db.get(user.posts[i], function(err, post_obj) { 
     if(i < user.posts.length) { 
      array.push(post_obj); 
      buildUserPostArray(array, user, res, i+1); 
     } 
     else { 
      console.log('Rendering view now.'); 
      res.render('user.jade', { 
       user: user.user, 
       posts: array 
      }); 
     } 
    }); 
} 

app.get('/users/:id', function(req, res) { 
    db.get(req.params.id, function(err, user_obj) { 
     if(err) res.send('err1'); //bad id or server down 

     array = []; 
     buildUserPostArray(array, user_obj, res, 0); 
    }); 
}); 

我使用意見直到我意識到我無法傳遞一個變量,然後我查看了列表,但在閱讀了許多教程之後我迷了路LS。

感謝您的幫助!

回答

2

你真的想使用一個視圖。只需以用戶爲關鍵字在帖子上創建視圖即可。

function(doc) { 
    emit(doc.user, {title: doc.title, date: doc.date, id: doc._id}); 
} 

然後,你可以簡單地查詢它:

GET /yourdb/_design/app/_view/by_user?key=film42 

這會給你所有與該用戶相關聯的視圖文件。

+0

乾杯!那就是訣竅。非常感謝! – film42 2012-07-29 04:36:45

0

就像Will Hartung所說的那樣,你需要一個觀點,但它應該看起來有點不同於Will的表現。

首先確保您想要發射的字段存在。請記住,null0是JavaScript中的虛假值,因此根據您的數據結構,您可能必須明確檢查字段是否爲undefined

下面是一些代碼,向你展示我的意思。

function(doc) { 
    if (doc.user && doc.title) { // This check is important 
     emit(doc.user, {title: doc.title, date: doc.date}); 
    } 
} 

您不必顯式地發出文檔ID,因爲無論如何都會自動發生。另外請確保不要發出整個文件emit(doc.user, doc);。這是低效的。如果您需要整個文檔僅發送null作爲值並使用include_docs=true URL參數。

所以基本上如果你發出null作爲一個值,那麼你會得到這樣的文件。

GET/yourdb/_design /應用/ _view/by_user?關鍵= film42 & include_docs =真

+0

偉大的迴應。我稍微改變了威爾(實際上它現在看起來和你的一樣),但它指出了我正確的方向! – film42 2012-07-29 22:19:13

相關問題