之前我写过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 } ]为此数据库里只会存在一条这样的值 完成需求
