node mysql id自增_mongodb之利用findAndModify()和nodejs实现自定义自增id

本文探讨了在MongoDB中为何需要自定义自增ID,而非依赖默认的ObjectId。作者分享了两种实现自增ID的方法,尤其是利用findAndModify()原子操作的策略。在Node.js应用中,通过Storage模块的updateNewIncoming方法实现了更新记录时自增ID的功能。建议关注findAndModify()的使用细节,以确保在不同环境中正确运行。
摘要由CSDN通过智能技术生成

mongodb有自己的ObjectId,为什么我们还要用自己的id呢?因为自定义的id可以实现自己的业务需求,比如我有一条记录,我需要更新它的一个字段,而且更新之后的数据要排在最前面。但是这个时候objectId是不变的,即使是使用毫秒级的时间戳,也可能同时插入多条数据,让你不知道更新的先后顺序。这个时候,你就需要自定义自增长的id.

项目使用的是nodejs,nodejs的io操作基本是异步的,逻辑运算等操作是同步的,所以我思考了大概两种实现自增长的方式,一种是设一个全局的id,只要有更新操作,就先将这个id先增加,再写入,如果有重启,初始化的时候就先从数据库把这个最大的id读出来,再作为重启后更新的id使用;第二种就是用findAndModify()的方式实现。

我使用的是第二种,主要利用了findAndModify()查找和更新是原子操作的特点。

storage部分代码:

'use strict';

var _ = require('lodash');

var mongodb = require('mongodb');

var Storage = function(){

this.db = {};

}

Storage.prototype.connect = function(opts,cb){

var self = this;

var client = mongodb.MongoClient;

client.connect(opts.uri,function(err,db){

if(err){

return cb(err);

}

self.db = db;

return cb();

})

}

Storage.prototype.updateNewIncoming = function(tx,cb){

var self = this;

self.db.collection('counters').findAndModify(

{_id:'txid'},

[['_id','asc']],

{$inc:{seq:1}},

{new:true},function(err,result){

if(err){

console.log(err);

return cb(err);

}

console.log('result111'+JSON.stringify(result.value.seq));

self.db.collection('tx_income').update({

txid:tx.id,

type:'newIncome',

},{

txid:tx.id,

type:'newIncome',

tx:tx,

id:result.value.seq

},{

w:1,

upsert:true,

},cb)

});

业务部分代码:

var Storage = require('./storage');

var config = require('./config');

var async = require('async');

var storage = new Storage();

var opts = {

uri : config.mongodb.uri // 自己设置config

};

async.series([

function(next){

storage.connect(opts,next);

},

function(next){

storage.updateNewIncoming(tx,function(){ // tx自己设置

console.log('next2');

return next();

})

},

],function(err){

// TODO(): 业务代码自己去写

});

大家要注意的地方在findAndModify()里边,可能写法不一样,这个跟nodejs的驱动有关,我在命令行里边用这种方式:

db.counters.findAndModify({query:{'_id':'txid'},update:{$inc:{'seq':1}},new:true})

可以实现操作,但是在代码中不行,所以大家可以去试一下。

参考 https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/#db.collection.findAndModify

送你几颗比特币玩玩:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值