Mongodb_id以及如何在php中实现它以在集合之间进行引用

Mongodb_id以及如何在php中实现它以在集合之间进行引用,php,mongodb,Php,Mongodb,由于我是Mongodb的新手,我对Mongodb ID有些困惑 在Mysql中,我们可以将任何变量定义为主键。在mongodb中可以这样定义任何变量作为主键吗 在控制台中,我们将_id定义为_id:objectId(“4c4ba5c0672c685e5e8aabf3”)。在php中如何做同样的事情,参数(“4C4BA5C0672C85E5E8AABF3”)从何而来?有没有办法用一个函数来表示这个参数 : ObjectId是一个12字节的BSON类型,使用以下内容构造: 表示自Unix纪元以来的

由于我是Mongodb的新手,我对Mongodb ID有些困惑

  • 在Mysql中,我们可以将任何变量定义为主键。在mongodb中可以这样定义任何变量作为主键吗

  • 在控制台中,我们将_id定义为_id:objectId(“4c4ba5c0672c685e5e8aabf3”)。在php中如何做同样的事情,参数(“4C4BA5C0672C85E5E8AABF3”)从何而来?有没有办法用一个函数来表示这个参数

  • :

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

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

    MongoDB中的文档需要有一个
    \u id
    字段,该字段的值是不可变的,并且对集合是唯一的。PHP表示为类的类型通常用于此字段。由于其组成,它非常适合确保集群的唯一性,类似于UUID

    如果您通读讨论集合中存储的文档结构的文档,您会发现任何BSON值都可以用作
    \u 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个字符的十六进制字符串打印,但重要的是要记住它们实际上是自己的——一个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类有一个
    \uu toString()
    方法,因此您还可以将其转换为字符串,以恢复其24个字符的字符串表示形式。同样,如果需要从24个字符的字符串构造MongoId,可以将其作为单个构造函数参数传递(正如我们在上面的查询中所做的那样)