我想通过Mongoose / MongoDB管理我自己的_id
- 因为默认值很长并且消耗带宽。
困难在于我需要创建它们(例如,通过递增计数器),但我需要在并发环境(Node.JS)中执行此操作。是否有一个简单的示例我可以创建一个模式,使用自定义_id
和静态方法(或更好的方法),每当创建新文档时自动生成下一个唯一_id
?< / p>
答案 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", ... }