【问题标题】:Insert json to Mongodb from php7从 php7 将 json 插入到 Mongodb
【发布时间】:2018-11-20 06:59:57
【问题描述】:

我正在做一个从 php5.6 到 7.x 的迁移项目,其中我有一个 json,键中有特殊字符。如何将其插入 mongodb?

在 php5.6 中,我使用 MongoClient 作为内部转换特殊字符的驱动程序,因此我能够插入文档。但我无法在 php7 中实现相同的目标。我正在使用 MongoDB\Driver\Manager 连接到 Mongodb。

编辑:

我有一组来自另一个系统的 api,格式如下

$content_array=
{
    "context": {
        "extensions": {
            "http://id.tincanapi.com/extension/platform": "web",
            "http://id.tincanapi.com/extension/browser-info": "Mozilla/5.0",
            "http://id.tincanapi.com/extension/host-session-id": "4e320015"
        }
    }
}
$dbconnection = new MongoDB\Client($uri);
$db = $dbconnection->$dbname;
$collection = $db->$dbcoll;

$collection->insertOne(json_decode($content_array));

它在上面失败了,说“插入的文档无效:键不能包含\”。\“:在键中”。 我知道在密钥中使用这些字符不是一个好习惯,但是由于这段代码使用 MongoClient 在 php5.6 中工作,我希望在迁移到 php7 时尽可能减少更改。

编辑 2:

在php5.6中工作的代码

$dbconnection = new \MongoClient($dbhost, $options); 
if (!empty($dbconnection)) {
$db = $dbconnection->selectDB($dbname);
$collection = $db->selectCollection($dbcoll);
$status = 0;
if (!empty($collection)) {
$collection->insert(json_decode($content_array));
$status = 1;
}

EDIT3:

我的一部分错误在于没有一次提供所有详细信息。我做了一个 json_decode 以在插入到 mongo 之前转换为本机 php 数组。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你现在为什么不使用MongoClient?您似乎是记录不佳的驱动程序安装过程的另一个受害者。它分为“两个”部分。第二部分在这里:MongoDB PHP Library
  • 好的..谢谢..让我试试
  • 使用 MongoDB\Client 后,我​​仍然无法插入上述格式的文档。它仍然说 Invalid document for insert: keys cannot contain \".\": .....
  • 你的代码是?因为我在这里没有看到任何代码,而且我也没有坐在你的办公桌前。 Edit your question 并实际显示您在做什么以及在哪里不起作用。就个人而言,我认为将这些用作“关键”名称是一个非常糟糕的主意,而您实际上应该将其转换为对象数组,例如 { "url": ..., "value": ... }
  • 已编辑.. 我知道在密钥中使用这些字符不是一个好习惯,但是由于这段代码使用 MongoClient 在 php5.6 中工作,我希望尽可能减少更改迁移到 php7 时。

标签: php json mongodb mongodb-query php-7


【解决方案1】:

总结一下:虽然各种版本的server都会插入带有这样字段名的文档,但是直到3.6才解除对这样字段名的限制(根据手册)。尽管对手册进行了更改,但 MongoDB 驱动程序正式不支持插入此类字段名称,并且可能直到某些未来版本的服务器实现转义方案 (SERVER-30575)。

您在旧版本的 PHP 驱动程序中没有遇到该错误的原因是 libmongoc 直到 1.6.0 (CDRIVER-1341) 才开始执行限制。 PHP 驱动程序 1.2.x 仍在使用 libmongoc 1.5.x。当我们碰到 libmongoc 1.8.x 时,这个异常会首先出现在 PHP 驱动程序 1.3.x 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多