可以使用Mongo的“对象ID”作为其唯一标识符吗?如果是这样,我如何将其转换为字符串并按字符串查找?

时间:2010-11-14 08:13:29

标签: mongodb database

例如......

user/view/?id=324gijsdfi3h25o1

我可以str() ......但是......

我如何通过字符串find来提升它?

编辑:我希望Mongo中的每个文档都有一个我可以查看的唯一标识符(通常是一个字符串)。我希望对象ID可以是这样的(因为它有很多字母而且它是唯一的。)我希望它能与HTTP GET一起使用。查看?UID = e93jfsb0e3jflskdjf

3 个答案:

答案 0 :(得分:18)

您可以使用字符串构造新的ObjectId。此示例使用MongoDB控制台:

db.users.find({ _id: ObjectId("4cdfb11e1f3c000000007822") })

我无法从您的问题中判断出您使用的语言驱动程序(如果有的话),但大多数驱动程序也支持此功能。

您不应将数据库中的ObjectId转换为字符串,然后将其与另一个字符串进行比较。如果你这样做,MongoDB不能使用_id索引,它必须扫描所有文档,导致查询性能不佳。

答案 1 :(得分:13)

问题:

  

使用Mongo的“对象ID”作为其唯一标识符是否可以?

是的,它旨在用于此目的。在分片环境中制作唯一ID可能很痛苦,因此MongoDB会为您做到这一点。

  

如果是这样,我如何将其转换为字符串并按字符串查找?

别。这不是一个字符串。 MongoDB实际上允许您覆盖默认ID。因此,如果您开始搜索#"4cdfb11e1f3c000000007822",Mongo会认为您正在寻找一个字符串。如果您要查找ObjectId("4cdfb11e1f3c000000007822"),Mongo将查找ObjectId(或MongoID)。

在你的问题中,看起来你正试图将其作为字符串传递。如何将其转换为“objectid”将取决于您的驱动程序。 PHP有一个MongoId。其他驱动程序具有类似的功能。

答案 2 :(得分:0)

ObjectId是生成唯一_id的便捷方式,但您可以自由地执行此操作。对于你的例子,

var o = {_id: Math.random().toString(36).substring(10)};
collection.insert(o, handleCollision);

工作正常,但你必须自己处理碰撞。然后,您可以根据需要使用直接字符串比较。