mongodb 实现mysql duplicate key update

2016-04-08 16:51:01

之前我写过mysql duplicate key update

地址:http://www.niefengjun.cn/blog/527086d0efca40720494525bc7e05049.html


今天遇到一个需求 给mongodb数据库更新数据 存在时 不插入 不存在的时候插入  想到mysql 能够一条语句实现此功能 查阅mongodb后发现mongodb 也提供了这个方法


  调用update()方法使用upsert标志创建一个新文档当没有匹配查询条件的文档时。下面的例子当inventory集合中没有包含{type:"web",item:"niefengjun.cn"}的文档时创建一个新文档:

db.inventory.update( { type: "web", item : "niefengjun。cn" },
{ $set :     { qty: 10 } },{ upsert :true     }
                )

 MongoDB添加_id字段和分配一个唯一的ObjectId作为它的值。新文档包含来自查询<query>条件的item和type字段,和来自更新<update>参数的qty字段:


下面用nodejs实现此功能   首先创建

var mongoConfig = require('../../configs/config.js');
var periferal = require('mongoose');
periferal.connect(mongoConfig.mongodb.periferal);
var Schema_periferal=periferal.Schema ;
// 定义审核数据Schema
var periferalSchema = new Schema_periferal({
    feedId: {
        type: String,
        default: ''
    },
    sourceId: { // 活动,toonPark的ID
        type: String,
        default: ''
    },
    source: { //1-名片, 2-群组,3-活动,4-park,5-社区名片
        type: Number
    },
    name: { // 活动,toonPark需存储该字段
        type: String,
        default: ''
    },
    state: { // 0-待审核,1-已通过,2-未通过
        type: Number,
        default: '0'
    },
    createTime: { // 创建时间
        type: Date,
        default: new Date()
    },
    read: { //  业务参数 无实际意义
        type: Number,
        default:'0'
    },
    auditTime: { // 审核时间
        type: Date
    }
});

//模型
module.exports = {
    periferalModel : periferal.model('periferal', periferalSchema ,'periferal')
};

然后再写更新方法

var Q = require('q') ;
var _ = require('underscore');
var periferalModel = require('./periferaldb.js').periferalModel ;
//periferalModel.find() ;
function periferalUpdate(args) {
    var defer = Q.defer();
    periferalModel.update(args, { $set :{ read: 1} }, {upsert: true}, function (err, docs) {
        if(err) {
            defer.reject(err);
        }
        else{
            defer.resolve(docs);
        }
        }
    )
    return defer.promise;
}

exports.periferalUpdate=periferalUpdate ;


test文件下调用

var periferal=require('../lib/mongodb/periferal.js') ;
var periferaldb=require('../lib/mongodb/periferaldb.js') ;
var ret={} ;
ret.feedId="cxxxxxxxxxxxxx111x" ;
ret.sourceId="cssssssssssss" ;
ret.source="1" ;
ret.state="0";
ret.read=1;


periferal.periferalUpdate(ret).then(function(data)
{
    console.log(data)
},function(err)
{
    console.log(err) ;
}
)

periferaldb.periferalModel.find(function(err,res)
{
    console.log(err,res)
}
)

结果 第一次执行

{ ok: 1,
  nModified: 0,
  n: 1,
  upserted: [ { index: 0, _id: 5707707a8f0489c4edfd6708 } ] }
null [ { feedId: 'cxxxxxxxxxxxxx111x',
    sourceId: 'cssssssssssss',
    name: '',
    state: 0,
    createTime: Fri Apr 08 2016 16:50:27 GMT 0800 (CST),
    read: 1,
    source: 1,
    _id: 5707707a8f0489c4edfd6708 } ]

第二次执行

/usr/local/bin/node periferal.js
{ ok: 1, nModified: 0, n: 1 }
null [ { feedId: 'cxxxxxxxxxxxxx111x',
    sourceId: 'cssssssssssss',
    name: '',
    state: 0,
    createTime: Fri Apr 08 2016 16:51:03 GMT 0800 (CST),
    read: 1,
    source: 1,
    _id: 5707707a8f0489c4edfd6708 } ]

为此数据库里只会存在一条这样的值  完成需求


你打算打赏多少钱呢?

打赏
(微信扫一扫)