从 JSON 导出插入时出现 php Mongodb "$oid is not valid for storage"错误

标签 php json mongodb

我有一个文件,其中包含使用 mongodb mongoexport 命令导出的以下数据:

mongoexport --db mydb --collection Users --out Users.json --jsonArray --journal

Users.json 包含:

[
    {
      "_id" : { "$oid" : "53c3e81ebb593fe827040ef7" },
      "email" : "one@email.com",
      "password" : "$2y$10$OYN9qOPa8EAU202Nsee7s.jDyT8ntHq2mBkM4wWAMxDYvARRyKmr2"
    }
]

我想在没有mongoimport命令的情况下导入数据,只使用php客户端,所以我这样做了

$fixtures = file_get_contents($fixturesPath . '/' . $fixtureFile);
$rows = json_decode($fixtures, true);
foreach ($rows as $row) {
  $this->db->Users->insert($row);
}

在插入正确之前 $row 的 var_dump:

(
  [_id] => Array
    (
        [$oid] => 53c3e81ebb593fe827040ef7
    )

  [email] => one@email.com
  [password] => $2y$10$OYN9qOPa8EAU202Nsee7s.jDyT8ntHq2mBkM4wWAMxDYvARRyKmr2
)

我收到以下错误:

[MongoWriteConcernException]
localhost:27017: $oid is not valid for storage.

问题是,如何从 php 导入这些数据?
显然,通过删除 _id 行它可以工作,但我认为我需要这个 id,所以我可以始终使用用户 id 进行测试。

最佳答案

默认情况下,使用 "extended JSON syntax" MongoDB 的标准。这是因为 JSON 不是“类型化”的,而 BSON 是“类型化”的,并且某些数据应该是“类型化的”,在本例中是 ObjectId

因此,如果您以“扩展语法”形式处理 JSON,那么您需要转换它:

foreach ( $rows as $row ) {
    foreach ( array_keys($row) as $key) {
        if ( $key == "_id" ) {
            $row[$key] = new \MongoId( $row[$key]['$oid'] );
        }
    }
    $this->db->Users->insert( $row );
}

或类似的东西,因为如果您要“检测”此类型和其他类型,则在此处循环会更实用。但基本上,您需要从 JSON 中的扩展表示形式“转换”这些特殊类型中的任何一种。

关于从 JSON 导出插入时出现 php Mongodb "$oid is not valid for storage"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24797366/

相关文章:

java - 使用express在 Node 服务器上接收JSON对象

json - MongoDB导入错误: Failed: error reading separator after document #1: bad JSON array format - found no opening bracket '[' in input source

mongodb - 如何连接到我的Docker的远程服务器中的Mongo DB?

php - 获取手机类型

php - PayPal Vault 交易费用/收费

php - Symfony 安全重定向到登录页面

java - 无法在 Retrofit 2 中获取 json 对象和数组

json - 带有动态键的 Swift Codable

javascript - 从前端到后端再到前端发送数据

node.js - 在 Mongoose 中将两个 OR 查询与 AND 组合