Moogoose实践之:Schema写全很重要,不然会把时间浪费在调错上!

本文通过作者的亲身经历,讲述了在使用Mongoose操作MongoDB时,由于Schema未包含所有字段导致更新操作失败的问题。作者试图在已有文档中添加`age`属性,但因Schema未定义该字段而无法成功。同时,文章还提出了如何处理内嵌文档,特别是Key-Value不确定的情况,如创建一个允许动态Key的votes内嵌文档,以便记录投票信息。
摘要由CSDN通过智能技术生成

哎,今天浪费了很多时间在调用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是没啥区别的,



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值