我正在从rails系统迁移数据,分配迁移的对象ID(如post0000000000001
等)非常方便。
我在这里读到
Creating Meteor-friendly id's in Mongo?
Meteor从
创建随机的17个字符串23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz
看起来是为了避免可能含糊不清的字符(省略1
和I
等)。
由于某种原因,ID是否需要随机?能够猜出Meteor文档的ID有安全隐患吗?!或者它只是一种生成唯一ID的简单方法吗?
使用顺序ID,Mongo似乎很好:
http://docs.mongodb.org/manual/core/document/#the-id-field http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
所以我猜想如果它存在,那就必须是Meteor约束。
答案 0 :(得分:2)
ID只需要是唯一的。
通常有一个顺序元素:例如使用整数,时间戳或具有顺序性的东西。
这在Meteor中不起作用,因为插入可以来自客户端,它们可能会断开一段时间,或者客户端时钟可能会关闭/具有不同的延迟。由于延迟补偿(即时插入),在编写_id时也无法知道先前的_id
(在顺序_id的情况下)。
DDP协议缺乏秩序的结果是决定使用完全随机的ID。这并不是说你不能使用自己的_ids。
虽然存在与此策略发生冲突的风险,但它在[number of docs in your collection]/[55^17] * 100 %
或最不可能的顺序上是最小的。如果发生这种情况,客户端将暂时插入它并在服务器使用Mongo Duplicate Key错误确认错误后取消它。
另外,当涉及安全性时,另一个答案。如果用户的_id已知,那就不是问题了。如果没有有效的哈希登录令牌或使用它检索任何信息,则无法登录。这当然仅适用于用户集合。如果你有自己的集合,一个容易猜到的URL包含一个id作为参考而没有发布方法检查读取数据的资格是一个风险,Meteor生成的高熵随机ID可以缓解。
只要它们是唯一的,就可以使用你自己的ID。
答案 1 :(得分:1)
我不是专家,但我认为Mongo需要一个唯一的ID,因此当它更新文档时,它实际上会创建一个具有相同ID的文档的新版本。
真正的问题是 - 我也不知道 - 如果我们可以在不搞定Mongo机制和可靠性的情况下更改ID,或者我们需要创建辅助属性? (我想它也可以制作一个更小的索引)?
但我也是,我可以想象安全性明智,如果文档ID很难猜测,那就更好了,尤其是用户ID!否则,在知道ID的情况下伪造用户是否容易或可能?任何人,如果我错了,请纠正我。
答案 2 :(得分:1)
我认为从Mongo更改ID是不可能的。
但您可以使用http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
轻松创建自动增量IDfunction getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);
return ret.seq;
}
我已经创建了一个可以实现的包,并且可以配置。 https://atmospherejs.com/stivaugoin/fluid-refno
var refNo = generateRefNo({
name: 'invoices', // default: 'counter'
prefix: 'I-', // default: ''
size: 5, // default: 5
filling: '0' // default: '0'
});
console.log(refNo); // output: "I-00001"
您现在可以使用refNo
在插入
也许它会帮到你