Meteor.Collection.ObjectID()与MongoDB ObjectId()的区别

30
Meteor.js为什么要使用自己的ID算法?为什么不使用MongoDB的ObjectId()呢?
2个回答

37

Meteor使用相同的方法来生成对象ID,如果您选择使用它:

Meteor.Collection.ObjectID()与MongoDB的ObjectID相同

这只是在Meteor.Collection名称下。它使用EJSON将对象ID保持在普通JSON中传递到客户端。因为基本上有两个数据库在Meteor中。

Minimongo

这是客户端上mongodb的一种缓存。当浏览器加载时,数据从主mongodb下载到此缓存。进行更改后,它们会上传到服务器。

服务器MongoDB

这是服务器上最初的10gen mongodb

因此,由于这两个数据库,Meteor需要在Meteor.Collection中包装mongodb功能并让您在客户端和服务器上使用相同的代码。

默认情况下,Meteor不会使用Object IDs,而是使用类似随机字母数字的文本。这样做是为了使您可以轻松地在URL和html属性中使用ID。

如果您使用new Meteor.Collection.ObjectID(),则会获得一个ObjectID对象,该对象将在服务器端使用mongodb的ObjectID规范。对象ID中的时间戳值不会被保存,但这实际上不会造成任何伤害。


我浪费了好20分钟试图弄清楚为什么正则表达式 /^[0-9a-fA-F]+$/ 在我的ObjectIds中返回 false ... 你提到Meteor使用“随机字母数字文本”,是否有任何逻辑来测试给定的字符串是否是有效的ID? - Brad M
3
@BradM,你可以尝试检查/^[A-Za-z0-9]{17}$/是否可行。它也不是完全由字母数字组成的,我从来没见过在_id中出现0或1。我认为那些在视觉上容易混淆的数字,比如l和1,是不会被使用的。 - Tarang

5
自从0.9.1版本开始,Meteor建议使用 Mongo.ObjectID 替代 Meteor.Collection.ObjectID。其实两者是一样的。 更多的命名约定变化,请查看history.md

1
是的,看到了这个,但很难弄清楚如何只获取_id字符串。使用以下代码。var newID = new Mongo.ObjectID; item._id = newID._str;感谢这个主题:https://dev59.com/FXfZa4cB1Zd3GeqPU7bK。 - yankeyhotel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接