Moogoose實踐之:Schema寫全很重要,不然會把時間浪費在調錯上!

哎,今天浪費了很多時間在調用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是沒啥區別的,



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章