之前我写过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 } ]
为此数据库里只会存在一条这样的值 完成需求
你打算打赏多少钱呢?
(微信扫一扫)