• 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

    送你几颗比特币玩玩:

    https://www.coincola.app/acts/red-packet?type=invitation&packet_id=gBbVudr7GwuTF3r71ihUq8vDiuiNdAgL&lang=zh-CN

  • 相关阅读:
    (转)UIMenuController的使用,对UILabel拷贝以及定制菜单
    (转)ios多线程开发——NSOperation详解
    IOS custom statusBar 思路
    objectiveC的@property(atomic, retain)对引用计数的影响
    A Generic Particle IO Library
    RenderMan与CG生产流程简述
    Maya Mesh Relaxation Deformer
    个人黄金市场交易记录/Personal Gold Market Operation Record
    Implementation of TLRW ReadWrite Lock
    给想雇佣我的人说的话/Some words to somebody who want to hire me.
  • 原文地址:https://www.cnblogs.com/yangluping/p/6504604.html
Copyright © 2020-2023  润新知