【问题标题】:Working with Mongo result objects - problems with _id field使用 Mongo 结果对象 - _id 字段的问题
【发布时间】:2015-01-30 21:23:50
【问题描述】:

我对 MongoDB 很陌生,并且遇到了一些小问题。在 Mongo 中,我从数据库中获取的每个对象都有那个特殊的 _id 字段。当然需要这个字段来唯一标识我的对象。

现在在 PHP 中,我的对象作为带有特殊 _id 字段的数组返回。

Array (
    [_id] => MongoId Object (
        [$id] => 547dc96b5c5db8a80f000029
    )
    [somekey] => somevalue
)

当编码为 JSON,通过一些前端发送并再次在 PHP 中解码时,_id 字段当然已被强制转换/销毁。

为了避免这种情况,我想我必须在从 Mongo 数据库中获取 _id 字段后强制转换它。

Array (
    [_id] =>  547dc96b5c5db8a80f000029
    [somekey] => somevalue
)

现在可以按照我的意愿安全地对其进行编码和解码。

但是当这个对象再次保存在 MongoDB 中时会起作用吗?即使在这种形式下,Mongo 会使用 _id 字段,因为它是 Mongo ObjectId 还是我需要相应地重新转换它?

有没有更好的方法呢?


更新 我只是尝试保存一个对象几次,它的 _id 作为 MongoId,它的 _id 作为字符串。具有 MongoId 的对象替换具有与字符串相同的 _id 的对象,在此处键入很重要。

这意味着我从数据库中获取的每个对象都需要手动转换它的 _id,并且在再次使用客户端从某些 JSON 接收到它之后,我必须再次将 evrry _id 重新转换为 MongoId。 在加载较大的对象列表时,这可能会对性能产生严重影响。

有没有更好的办法?

【问题讨论】:

  • 将代表_id的字符串改回一个对象? $array['_id'] = new MongoId('547dc96b5c5db8a80f000029');
  • @Glavić 所以你认为我必须将每个 _id 重铸回 MongoId 对象,然后再将它们发送到数据库?
  • 最简单的方法是对此进行测试,但我认为如果 _id 以字符串形式呈现,它将替换 mongodb 中的对象。请试一试...
  • @Glavić 试过了。见更新。奇怪...
  • So _id is treated as unique field, no matter what type it has. 是 mongodb 的工作原理。字段_id始终唯一的字段,无论它是什么类型;这就是它应该如何工作的。

标签: php json mongodb


【解决方案1】:

您应该将字符串表示的字段_id 改回MongoId 对象:

$array['_id'] = new MongoId($array['_id']);

我认为这不会对性能产生严重影响,最好对其进行测试。另一方面,您仍然可以为 _id 字段、整数或字符串创建自己的类型,它不必是对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2013-06-11
    • 1970-01-01
    • 2016-05-10
    • 2015-03-16
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多