2

由于我是 Mongodb 的新手,我对 mongodb id 有一些困惑。

  1. 在Mysql中,我们可以将任何变量定义为主键。是否可以像这样在mongodb中定义任何变量作为主键?

  2. 在控制台中,我们将 _id 定义为 _id:objectId("4c4ba5c0672c685e5e8aabf3")。如何在 php 中做同样的事情。它来自哪里的参数(“4c4ba5c0672c685e5e8aabf3”)是什么?有没有办法通过函数生成这个参数?

4

2 回答 2

2

MongoDB 中的文档需要有一个_id字段,该字段的值对于集合来说既不可变又是唯一的。ObjectId类型,PHP 表示为MongoId类,通常用于此字段。由于其组成,它非常适合确保跨集群的唯一性,类似于 UUID。

如果您阅读记录文档文档,其中讨论了存储在集合中的文档的结构,您会发现任何 BSON 值都可以用作_id,但数组除外(由于 MongoDB 如何处理数组字段的索引) . 在同一个集合中,您可以在您的文档中自由使用不同的 ID 类型,尽管为了您的个人理智,建议保持一致。

// Allowed
db.foo.insert({ _id: 1 })
db.foo.insert({ _id: 'abc' })
db.foo.insert({ _id: ObjectId() })
db.foo.insert({ _id: { x: 1, y: 2 }})
db.foo.insert({ _id: { x: 1, o: ObjectId() }})
db.foo.insert({ _id: { x: 1, a: [1, 2, 3] }})

// Not allowed
db.foo.insert({ _id: [1, 2, 3] })
db.foo.insert({ _id: ['a', ObjectId()] })

尽管 ObjectId 通常打印为 24 个字符的十六进制字符串,但重要的是要记住它们实际上是它们自己的BSON 类型——一个 12 字节的二进制值。如果您在 PHP 中通过其 ObjectId 查询文档,则需要匹配 MongoId 值,如下所示:

// Matches
$collection->findOne([ '_id' => new MongoId('4c4ba5c0672c685e5e8aabf3') ]);

// Doesn't match (unless a document's ID was really that string
$collection->findOne([ '_id' => '4c4ba5c0672c685e5e8aabf3' ]); 

最后,如果您想在 PHP 中生成 ObjectId,您可以简单地构造 MongoId 实例,方法是不向其构造函数传递任何参数。MongoId 类有一个__toString()方法,因此您也可以将其转换为字符串以获取其 24 个字符的字符串表示形式。同样,如果您需要从 24 个字符的字符串构造 MongoId,您可以将其作为单个构造函数参数传递(就像我们在上面的查询中所做的那样)。

于 2013-04-08T22:48:16.780 回答
0

http://docs.mongodb.org/manual/reference/object-id/

ObjectId 是一个 12 字节的 BSON 类型,使用以下方法构造:

  • 表示自 Unix 纪元以来的秒数的 4 字节值,
  • 3 字节机器标识符,
  • 2 字节进程 ID,以及
  • 3 字节计数器,以随机值开始。

http://www.php.net/manual/en/class.mongoid.php , http://www.php.net/manual/en/mongocollection.ensureindex.php

于 2013-04-08T13:56:38.517 回答