如何在Mongoose中自动生成自定义ID?

时间:2013-03-28 17:10:24

标签: node.js mongodb mongoose

我想通过Mongoose / MongoDB管理我自己的_id - 因为默认值很长并且消耗带宽。

困难在于我需要创建它们(例如,通过递增计数器),但我需要在并发环境(Node.JS)中执行此操作。是否有一个简单的示例我可以创建一个模式,使用自定义_id和静态方法(或更好的方法),每当创建新文档时自动生成下一个唯一_id?< / p>

3 个答案:

答案 0 :(得分:2)

正如Chad简要介绍的那样,Mongo为您实现了一个uuid系统,考虑了时间戳,网络地址和机器名称,以及一个自动递增的2位数计数器(如果出现多个具有相同时间戳的条目)。此模式用于允许分布式数据库(即,在不同计算机上运行不同的数据库实例),同时确保每个条目仍具有唯一标识符(因为计算机名称部分将不同)。

尝试使用自己的架构可能会极大地限制mongo提供的可伸缩性。

答案 1 :(得分:2)

您可以使用Mongo的findAndModify()来生成顺序值。以下是一个例子:

// (assuming db is a reference to a MongoDB database)
var counters = db.collection('counters');
var query = {'name': 'counterName'};
var order = [['_id','asc']];
var inc = {$inc:{'next':1}};
var options = {new: true, upsert: true};
counters.findAndModify(query, order, inc, options, function(err, doc) {

  if(err) {
    callback(err);
    return;
  }      

  var id = doc.next;
  callback(null, id);
});

虽然在应用程序中生成顺序ID看起来很漂亮,但请记住它们存在一些缺点(例如,当您需要在地理上拆分数据库时),这就是为什么Mongo使用它所做的长伪随机密钥。

答案 2 :(得分:0)

这应该有效

import { randomString } from '@/helpers'

const taskSchema = new mongoose.Schema({
    _id: {
        type: String,
        unique: true,
        default: randomString
    },
    title: String,
    ...
})

随机字符串函数

// helpers

export const randomString = (length?: number) => {
    let result = ''
    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
    const charactersLength = characters.length
    const n = length || 15
    for (let i = 0; i < n; i++) {
        result += characters.charAt(Math.floor(Math.random() * charactersLength))
    }

    return result
}

测试结果

{ "_id": "EIa9W2J5mY2lMDY", ... }