1

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

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

4

3 回答 3

2

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

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

于 2013-03-28T17:18:34.447 回答
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 使用长伪随机键的原因。

于 2013-03-28T17:18:55.407 回答
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", ... }
于 2021-08-04T05:49:36.293 回答