nics 发表于 2017-12-15 18:43:50

mongodb之利用findAndModify()和nodejs实现自定义自增id

  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
页: [1]
查看完整版本: mongodb之利用findAndModify()和nodejs实现自定义自增id