哎,今天浪費了很多時間在調用Moogoose的update函數上,我有一個很簡單的文檔結構,類似於:{name: xxx},MongoDB的驅動,我用了Moogoose,我的問題是,我想對該文檔,增加一個屬性,比如age,那麼文檔就變成:{name: xxx, age: 16}。相關代碼如下:
NameCandidateSchema = new mongoose.Schema(
name: String
)
handleVoterVoteFor: (req, res)->
voter = req.params.voter
{id} = req.query
query = {_id: id}
update = {age: 16}
NameCandidate.findOneAndUpdate(query, update, (err, doc)=>
if err then res.send(500, err)
else
console.log(doc)
res.json(200, doc)
)
問題是,age屬性死活插入不到文檔中去!白白花了2個小時,終於明白了,Schema裏面忘記把age屬性加進去了。。。汗!
那麼,假如我想加入一個內嵌的文檔,但是Key, Value不定,怎麼辦呢?舉個例子,每個name,大家都可以對他投票,投票的記錄放在同一個文檔中,是一個內嵌的文檔,key是投票人的名字,值是他投的票數,比如,對於puncha這個名字,張三、李四分別投了2票3票,那麼該文檔可以表示成: {name: 'puncha', votes: {'張三': 2, '李四', 3}}。那麼Schema怎麼定義呢?
mongoose = require('mongoose');
Schema = mongoose.Schema;
NameCandidateSchema = new mongoose.Schema(
name: String
votes: Schema.Types.Mixed
)
handleVoterVoteFor: (req, res)->
#console.log(req.query.name + req.query.id + req.query.score)
voter = req.params.voter
{id} = req.query
queryClouse = {_id: id}
updateClouse = {}
updateClouse["votes.#{voter}"] = parseInt(score, 10)
NameCandidate.update(queryClouse, updateClouse, (err, numberAffected)=>
if err then res.send(500, err)
else
console.log(numberAffected)
res.json(200, numberAffected)
)
看到沒,要使用Schema.Mixed這個類型。BTW, 這裏我用了update,其實和上面的findOneAndUpdate是沒啥區別的,