2011-02-17 61 views
2

中有蒙戈的投票數據模型/更新查詢的例子更新:
http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails#MongoDBDataModelingandRails-AtomicUpdates蒙戈數據建模/截止投票(上下)

不過,我需要向上和向下票(基本上,一個人即可無論是投票還是投票)。另外,我希望選民能夠改變主意,改變立場,或者反過來(所以選民名單和總人數不適合)。

什麼是最好的數據模型和相應的更新調用?

我看到兩種可能,要麼做一個

'votes': [{ 'user_id' : ... , 'vote': ±1 }] 

'upvoters': [...], 'downvoters': [...] 

但我不能做的第一個又一個更新查詢,以及第二個看起來有點怪異(儘管它可能只是我)。

+0

如果我沒有記錯,在MongoDB的文檔給定將使-1的例子(不只是加1)......你試過了嗎?或者你需要知道確切的下降與上漲的票數? – 2011-02-17 22:40:10

+0

重大事件。是的,原因是我想讓人們改變主意,並在之前投下贊成票的情況下投下贊成票,而在mongodb中的例子不允許這樣做。將此添加到問題文本。 – 2011-02-17 22:49:36

回答

1

第一個模式看起來不錯。第二個模式很難,因爲當用戶點擊upvote並且downvote時,你需要將userId添加到'upvoters',以'downvoters'並從'upvoters'中移除,反之亦然。

我想投票它nestead收集一些文件(假設它的問題)。

db.questions.update({votes.userId: .. },{ $set : { votes.$.vote : 1 } });//upvote 
db.questions.update({votes.userId: .. },{ $set : { votes.$.vote : -1 } });//down 

,似乎你需要的內部問題,收集創建額外的字段來計算的向上/向下票總和:

db.questions.update({_id: .. },{ $inc : { votesCount : 1 } }); //up vote 
db.questions.update({_id: .. },{ $inc : { votesCount : -1 } }); // down vote 

如果您需要添加新用戶到票的陣列使用

Possitional operator.

1

似乎使用第二種模式更簡單。

Document: { name: "name", 
      upvoters: [name1, name2, etc], 
      downvoters: [name1, name2, etc], 
      } 

要獲得總票數就可以得到doc和使用 doc.upvoters.length-doc.downvoters.length (開始upvoters和downvoters陣列是[]每個文檔)

要記錄在項目的「C」任何給予好評的用戶的「x」只是做:

db.votes.update({name:"c"},{$addToSet:{upvotes:"x"},$pull:{downvotes:"x"}}) 

這是原子,它有優勢做,即使您運行10次同樣的事情。 它還可以避免您必須檢查「x」是否已投票支持「c」以及哪種方式。

錄製downvote只是扭轉這種局面:

db.votes.update({name:"c"},{$addToSet:{downvotes:"x"},$pull:{upvotes:"x"}})