Nodejs mongo数据库,自定义id的自增,有方法么

Nodejs mongo数据库,自定义id的自增,有方法么

5 回复

Node.js MongoDB 中自定义 ID 的自增方法

在使用 Node.js 和 MongoDB 进行开发时,有时我们希望为每个文档生成一个自定义的、自增的 ID。然而,MongoDB 本身并不支持自动递增字段,因为这与分布式系统的特性相冲突。不过,我们可以实现一个简单的自定义逻辑来模拟这种行为。

方法概述

  1. 创建一个集合:用于存储当前的最大 ID。
  2. 每次插入新文档前:查询该集合以获取最新的 ID,并增加 1。
  3. 更新最大 ID:将新的最大 ID 更新回集合中。

示例代码

首先,确保你已经安装了 mongodb 包:

npm install mongodb

然后,可以使用以下代码来实现自定义 ID 的自增功能:

const { MongoClient } = require('mongodb');

async function main() {
    const uri = "your_mongodb_connection_string";
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        await client.connect();
        const database = client.db('your_database_name');
        const idCollection = database.collection('sequence');

        // 创建一个序列集合,如果不存在的话
        await idCollection.createIndex({ _id: 1 }, { unique: true });

        async function getNextSequenceValue(sequenceName) {
            const filter = { _id: sequenceName };
            const update = { $inc: { seq: 1 } };

            const result = await idCollection.findOneAndUpdate(filter, update, { upsert: true, returnDocument: 'after' });
            return result.value.seq;
        }

        // 插入新文档时调用
        async function insertWithCustomId(collectionName, doc) {
            const sequenceName = collectionName;
            const customId = await getNextSequenceValue(sequenceName);

            doc._id = customId;
            const collection = database.collection(collectionName);
            const result = await collection.insertOne(doc);
            return result.ops[0];
        }

        // 使用示例
        const newDoc = { name: 'John Doe', age: 30 };
        const insertedDoc = await insertWithCustomId('users', newDoc);
        console.log(insertedDoc);

    } finally {
        await client.close();
    }
}

main().catch(console.error);

解释

  1. getNextSequenceValue: 这个函数用于获取下一个自增 ID。它会检查 sequence 集合中是否存在对应的 _id,如果不存在则创建一个新的记录。
  2. insertWithCustomId: 这个函数用于插入新文档,并为其设置自定义 ID。它调用 getNextSequenceValue 获取下一个 ID 并将其赋值给新文档的 _id 字段。

这种方法虽然简单,但在高并发环境下可能会出现一些问题(例如 ID 碎片化),因此在实际生产环境中需要进一步优化或考虑其他方案。


可以通过自己管理ID的序列,例如使用Monogoose:

  var Schema = mongoose.Schema;
  var models = {};
  /**
    * 存储ID的序列值
    */
  Sequence = new Schema({
	  _id: String,
	  next: Number 
  });

Sequence.statics.findAndModify = function (query, sort, doc, options, callback) { return this.collection.findAndModify(query, sort, doc, options, callback); };

Sequence.statics.increment = function (schemaName, callback) { return this.collection.findAndModify({ _id: schemaName }, [], { $inc: { next: 1 } }, {“new”:true, upsert:true}, callback); };

models.Sequence = mongoose.model(‘Sequence’, Sequence);

SomeDoc = new Schema({ ‘id’ : { type : Number, index: { unique: true } }, … }); //在创建文档时,获取自增ID值 SomeDoc.pre(‘save’, function(next) { var that = this; if( that.isNew ) { models.Sequence.increment(‘SomeDoc’,function (err, result) { if (err) throw err; that.id = result.next; next(); }); } else { next(); } });

你好哈!~请问mongodb在国内有什么比较好的社区么?

在nosqlfan.com中也有mongodb的专题

在Node.js中使用MongoDB时,如果你想要为自定义ID实现自增功能,可以通过以下几种方式来实现:

方法一:使用MongoDB的内置功能

MongoDB本身不支持自增ID,但你可以通过创建一个集合来模拟这个功能。这个集合可以用来存储当前的最大ID值。

示例代码:

  1. 创建一个集合sequence来存储当前最大ID值:

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    const sequenceSchema = new Schema({
        _id: { type: String, required: true },
        seq: { type: Number, default: 0 }
    });
    
    const SequenceModel = mongoose.model('Sequence', sequenceSchema);
    
  2. 定义一个函数来获取下一个自增ID:

    async function getNextSequenceValue(sequenceName) {
        const filter = { _id: sequenceName };
        const update = { $inc: { seq: 1 } };
        const options = { upsert: true, new: true };
    
        const result = await SequenceModel.findOneAndUpdate(filter, update, options);
        return result.seq;
    }
    
  3. 在插入文档时使用该函数获取下一个自增ID:

    async function createDocument(data) {
        const customId = await getNextSequenceValue('custom_id_sequence');
    
        const document = new YourModel({
            _id: customId,
            ...data
        });
    
        await document.save();
        return document;
    }
    

方法二:使用第三方库

你也可以使用一些第三方库来简化这个过程,例如mongoose-sequence

示例代码:

  1. 安装第三方库:

    npm install mongoose-sequence
    
  2. 使用mongoose-sequence来定义模型:

    const mongoose = require('mongoose');
    const sequence = require('mongoose-sequence')(mongoose);
    
    const YourSchema = new mongoose.Schema({
        name: String
    }, {
        _id: false,
        id: false
    });
    
    YourSchema.plugin(sequence, { id: 'your_custom_id' });
    
    const YourModel = mongoose.model('YourModel', YourSchema);
    
  3. 插入文档时会自动使用自增ID:

    async function createDocument(data) {
        const document = new YourModel(data);
        await document.save();
        return document;
    }
    

这两种方法都可以实现自定义ID的自增功能。选择哪种方法取决于你的具体需求和偏好。

回到顶部