草庐IT

php - mongo php 库 updateOne 和 insertOne 损坏集合

coder 2023-11-07 原文

我有一个应用程序正在尝试从旧版驱动程序更新到新版驱动程序。当触发以下代码时,我遇到了集合被损坏的问题。我想我已经缩小了范围。

    function update($collection,$criteria,$data,$insertIfNotExists = false)
{
    if(!empty($collection) && !empty($criteria) && !empty($data)) {
        if (!isset($this->collection[$collection])) {
            $this->collection[$collection] = (new MongoDB\Client)->hebe->{$collection};
        }
        if ($insertIfNotExists) {
            $oldData = $this->collection[$collection]->findOne($criteria);
            if ($oldData == NULL) {
                $data['createdDate'] = date("Y-m-d H:i:s");
                $data['modifiedDate'] = (isset($data['modifiedDate'])) ? $data['modifiedDate']:date("Y-m-d H:i:s");
                /*
                return ($this->collection[$collection]->insertOne($data)) ? array('status'=>'ok'):array('status'=>'error','error'=>'unknown_error');
                */
            } else {
                $newData = $oldData;
                foreach($data as $n=>$v) {
                    $newData[$n] = $v;
                }
                $newData['modifiedDate'] = (isset($newData['modifiedDate'])) ? $newData['modifiedDate']:date("Y-m-d H:i:s");

                /*
                return ($this->collection[$collection]->updateOne($criteria,['$set' => $newData])) ? array('status'=>'ok'):array('status'=>'error','error'=>'unknown_error');
                */
            }
        } else {
            /*
            return ($this->collection[$collection]->updateOne($criteria,['$set' => $data])) ? array('status'=>'ok'):array('status'=>'error','error'=>'unknown_error');
            */
        }
    }

}

示例变量是

$collection = 'customer'

$criteria = array ( 'number' => '9999',)

$data = array (
  'number' => '9999',
  'name' => 'Testing Account',
  'reference' => 'Peter Smith',
  'defaultDeliveryAddress' => 1,
  'visitAddress' => '',
  'address' => '',
  'district' => 'Marknad',
  'postAddress' => '',
  'orgNumber' => '5562041771',
  'phone' => '031-7802700',
  'fax' => '031-193328',
  'groupCode' => 'int',
  'creditCustomer' => '',
  'typeOfDelivery' => 'Bil',
  'typeOfPayment' => '10',
  'emailAddresses' => 
  array (
    'invoice' => 'email1@domain.com',
    'order' => 'email2@domain.com',
    'deliveryNote' => 'email3@domain.com',
    'packingSlip' => 'email4@domain.com',
  ),
  'orderType' => NULL,
  'termsOfDelivery' => 'RC',
  'creditLimit' => 100000.0,
  'pricelist' => 4,
  'pricelist1' => '',
  'pricelist2' => '9998',
  'pricelist3' => '104',
  'discount' => NULL,
  'countryCode' => 'SE',
  'currencyCode' => 'SEK',
  'blocked' => 0,
  'deliveryCost' => 0,
  'vatCode' => '2',
  'email' => 'peremail@domain.com',
  'password' => 'password',
  'modifiedDate' => '2019-06-25 00:00:00',
  'deliveryAddresses' => 
  array (
    0 => 
    array (
      'row' => 1,
      'name' => 'Test Address',
      'address' => 'Box 12345',
      'postAddress' => '42246',
      'default' => true,
    ),
    1 => 
    array (
      'number' => '9999',
      'name' => 'Testing Address',
      'reference' => '13232',
      'address' => 'Box 12245',
      'postAddress' => '42246',
    ),
  ),
  'references' => 
  array (
    0 => 
    array (
      'number' => '9999',
      'name' => 'Testing',
      'email' => '',
      'password' => '',
    ),
    1 => 
    array (
      'number' => '9999',
      'name' => 'Testing2',
      'email' => '',
      'password' => 'password',
    ),
    2 => 
    array (
      'number' => '9999',
      'name' => 'Peter Smith',
      'email' => '',
      'password' => 'password',
    ),
  ),
)

有人可以指出我在 updateOneinsertOne 上做错的正确方向吗?根据我对文档的理解,它支持数组。

编辑:我将这个系统和 MongoDB 从 2.6 升级到 3.6 的一些背景知识。我还从旧版 mongo 升级了 mongodb 驱动程序。

最佳答案

问题是集合中的旧数据有引号,而 updateOne/insertOne 数据没有。更正此问题似乎可以解决问题。

关于php - mongo php 库 updateOne 和 insertOne 损坏集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57015521/

有关php - mongo php 库 updateOne 和 insertOne 损坏集合的更多相关文章

  1. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  2. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  3. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  4. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  5. ruby - Ruby gems 的问题(损坏?)试图让指南针在 npm 中工作 - 2

    我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3

  6. python - 用于从 Python 到 Ruby 查找集合的所有分区的翻译函数 - 2

    我有以下python函数来递归查找集合的所有分区:defpartitions(set_):ifnotset_:yield[]returnforiinxrange(2**len(set_)/2):parts=[set(),set()]foriteminset_:parts[i&1].add(item)i>>=1forbinpartitions(parts[1]):yield[parts[0]]+bforpinpartitions(["a","b","c","d"]):print(p)有人可以帮我把它翻译成ruby​​吗?这是我目前所拥有的:defpartitions(set)ifnots

  7. C# 的 LINQ 用于在 ruby​​ 中等效的集合操作 - 2

    我是ruby​​开发的新手,我目前正在使用rails2.3.11在ruby​​1.8.7中开发一个项目,我想知道这种语言是否有与C#的linq等效的集合操作,例如where子句。谢谢。 最佳答案 Ruby中Linq的where等价于find_all检查documentationfortheEnumerableModule用于其他功能。 关于C#的LINQ用于在ruby​​中等效的集合操作,我们在StackOverflow上找到一个类似的问题: https://

  8. ruby - RVM screen 内部损坏 - 2

    我正在使用screen,甚至在rvm1.9.2之后并且有一个合适的.rvmrc我的服务器将仍然使用jruby。我的.screenrc包含shell#{SHELL}rvm信息显示jruby。好像rvm1.9.2没有任何效果,但它在screen外工作正常。 最佳答案 好的,我找到了solution.创建一个.screenrc文件并将此代码段放入其中:shell-$SHELLofficialinstructions省略破折号。 关于ruby-RVMscreen内部损坏,我们在StackOver

  9. ruby-on-rails - Rails 表单对象与 reform-rails 与集合不工作或验证 - 2

    我正在使用reform-railsgem为了在我的Rails项目中使用表单对象。我意识到表单对象对于我在下面使用的示例代码来说可能有点矫枉过正,但它仅用于演示目的。在我创建一个用户的表单中,与该用户记录关联的是两个user_emails。#models/user.rbclassUser请注意,我没有在User模型中使用accepts_nested_attributes_for:user_emails。在我看来,表单对象的要点之一是它可以帮助您摆脱使用accepts_nested_attributes_for,所以这就是为什么我试图在没有它的情况下这样做。我从thisvideo得到了这个

  10. ruby - @users 变量为空。忘记为 will_paginate 传递集合对象? - 2

    问题localhost:3000/users/不会显示我谦虚地进入,因为我是第一次尝试通过Rails教程。我在第10章,我已经花了5个小时解决这个问题。当我尝试访问localhost:3000/users/时出现错误(我相信这与factory_girl有关)解释了@users变量为空并且我忘记了为will_paginate传递一个集合对象。我目前在第10章第10.23节,每次运行时:$bundleexecrakedb:reset$bundleexecrakedb:populate$bundleexecrakedb:test:prepare我在解释时遇到错误rakeaborted!Fac

随机推荐