我想_id
通过 Mongoose/MongoDB 管理我自己的 - 因为默认的很长并且消耗带宽。
困难在于我需要创建它们(例如,通过增加一个计数器),但我需要在并发环境(Node.JS)中执行此操作。是否有一个我可以遵循的简单示例创建一个模式,该模式具有自定义_id
和静态方法(或更好的方法)_id
,每当创建新文档时自动生成下一个 unique ?
正如 Chad 简要介绍的那样,Mongo 为您实现了一个 uuid 系统,其中考虑了时间戳、网络地址和机器名称,以及一个自动递增的 2 位计数器(以防出现多个具有相同时间戳的条目)。此模式用于允许分布式数据库(即,在不同机器上运行不同的数据库实例),同时确保每个条目仍具有唯一标识符(因为机器名称部分将不同)。
尝试使用自己的模式可能会极大地限制 mongo 提供的可伸缩性。
您可以使用 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 使用长伪随机键的原因。
这应该工作
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", ... }