Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MongoDB$set未更新记录_Php_Mongodb - Fatal编程技术网

Php MongoDB$set未更新记录

Php MongoDB$set未更新记录,php,mongodb,Php,Mongodb,我正在使用PHP PECL扩展测试MongoDB,但是我很难让某个更新查询正常工作。我到处寻找答案,运气不好 我创建了一个基本集合: $m = new Mongo; $collection = $m->testdb->testcollection; $collection->insert(array( 0, 1, 1, 2, 3, 5 )); 使用findOne和var\u dump记录如下所示: array '_id' => object(Mo

我正在使用PHP PECL扩展测试MongoDB,但是我很难让某个更新查询正常工作。我到处寻找答案,运气不好

我创建了一个基本集合:

$m = new Mongo;
$collection = $m->testdb->testcollection;

$collection->insert(array(
    0, 1, 1, 2, 3, 5
));
使用
findOne
var\u dump
记录如下所示:

array
  '_id' => 
    object(MongoId)[6]
      public '$id' => string '4f3bde65a1f7a0315b000000' (length=24)
  0 => int 0
  1 => int 1
  2 => int 1
  3 => int 2
  4 => int 3
  5 => int 5
当我想使用
$set
进行更新时,就会出现问题。我的查询基于PHP手册中显示的映射

这里我想将字段
0
更新为值
100

$obj = $collection->findOne();

$collection->update(
    array('_id' => $obj['_id']),
    array('$set' => array(0 => 100))
);
重新获取该记录显示它保持不变

我确实想知道我是否在
\u id
上做错了什么,但是下面的更新查询确实起作用,尽管用一个新值替换整个记录,而不是简单地更新一个字段

$collection->update(
    array('_id' => $obj['_id']),
    array(0 => 100)
);
对象转储:

array
  '_id' => 
    object(MongoId)[7]
      public '$id' => string '4f3bde65a1f7a0315b000000' (length=24)
  0 => int 100
有人能指出我做错了什么,以及如何正确使用
$set
。我相信这是显而易见的,我只需要第二双眼睛


非常感谢。

您不能在mongodb中将数字用作有效的字段名。尝试将您的字段“0”放在引号中,这就是它的实际实现方式。

在执行各种测试后,根据yiu H的评论和nnythm的回答,我发现了以下几点

在所有情况下,我都使用以下通用代码:

$collection->update(
    array('_id' => $obj['_id']),
    array('$set' => $updateObj)
);
以下情况根本不起作用:

  • $updateObj=array(0=>100)
  • $updateObj=array('0'=>100)
这些方法确实有效:

  • $updateObj=array(1=>100)
  • $updateObj=array('1'=>100)
在谷歌搜索和阅读了一些Mongo PHP文档之后,我发现我可以使用对象而不是数组。所以我试了一下:

$updateObj = new stdClass;
$updateObj->{0} = 100;
这管用! 但我还没找到原因

编辑:

浏览mongo扩展源代码

MongoCollection->update
方法执行以下操作,buf已经是指针,newobj是zval(查询的第二个参数)
HASH_P
仅返回zval的正确属性进行编码,具体取决于它是数组还是对象

zval_to_bson(buf, HASH_P(newobj), NO_PREP TSRMLS_CC)
bson\u encode
功能执行以下功能,功能相同。buf指针和zval z

zval_to_bson(&buf, HASH_P(z), 0 TSRMLS_CC);
所以我做了下面的测试

$updateObj = new stdClass;
$updateObj->{0} = 100;

$one = bson_encode($updateObj);

$updateObj = array(0 => 100);

$two = bson_encode($updateObj);

var_dump($one === $two);
输出为
true

仍然不知道为什么
0
不适用于数组中的字段名

编辑2:

进一步的实验表明,当更新中包含名为
0
的字段时(仅数组,对象很好)不会对任何字段执行更新

例如:

$updateObj = array(
    '1' => 200
);
工作,字段
1
已更新

$updateObj = array(
    '0' => 100,
    '1' => 200
);
不起作用,字段
0
1
均未更新


我想我要提交一份bug报告。

我正在调查为什么会发生这种情况。我不认为我能找到一种方法来“修复”这个问题

JavaScript在数组和关联数组/对象之间存在差异。PHP在数组和对象之间有区别。对于PHP,关联数组是数组,对于JavaScript,它是对象

当PHP驱动程序需要将数组转换为JSON对象时,它会尝试判断数组是否为:一个具有从0开始的顺序编号键的普通数组;或关联数组。当前的实现将具有顺序编号键的任何数组(从0开始)视为普通数组。普通数组不包含键。这就是问题所在。在驱动程序看到普通数组的情况下,发送到服务器的BSON中没有字段名信息,因此服务器无法更新字段

我想不出在不破坏任何现有代码的情况下改变这种行为的方法。因此,如果需要数字字段名,则必须为“主文档”使用stdClass对象。或者,您可以将这些密钥推入嵌入式文档,然后更新:

<?php $m = new Mongo; $collection = $m->demo->testcollection; $collection->insert(array( "_id" => 'bug341', 'data' => array( 0, 1, 1, 2, 3, 5 ) )); $obj = $collection->findOne(); $update = array('data.0' => 'zero int'); $collection->update( array( '_id' => 'bug341' ), array( '$set' => $update ) ); $obj = $collection->findOne(); var_dump($obj); ?>
我们可以使用下面的php示例更新mongo db中的记录:-
$m=新的MongoClient()//PHP mongoclient函数
回显“成功连接到数据库”;
$db=$m->dbname//输入数据库名
$collection=$db->profile;
$document=数组(
“name”=>$\u请求['name'],
“电子邮件”=>$\u请求[“电子邮件”],
“年龄”=>$\u请求[“年龄”],
“地址”=>$\u请求[“地址”],
“comment”=>$\u请求['comment']
);
//打印(文件);死亡
//echo$_请求['pfid'];
$filter=array(''u id'=>newmongoid($'u请求['pfid']);
$update=数组(“$set”=>$document);
$collection->update($filter,$update);

这行吗:
数组('$set'=>array(1=>100))
?@yi_H:行。字段
1
已更新,为什么它不适用于字段
0
array('$set'=>array('0'=>100))
具有相同的结果,字段
0
未更新。如果提交到PHP驱动程序()有了以上这些细节,我相信克里斯蒂娜公司很快就会找到解决办法:)@AdamC:Argh,他们有自己的问题跟踪程序。我已经为PECL软件包提交了一份报告,我讨厌重复这些东西,但他们自己的系统似乎更加活跃。是的,所有官方支持的驱动程序都在MongoDB.org网站上的Jira中有自己的跟踪程序。如果你没有得到任何关于包缺陷的线索,只需打开一个,然后引用包缺陷。哦,鉴于这里的细节,链接到这个问题/答案是个不错的主意:)
we can update record in mongo db using php example below:-

$m = new MongoClient(<Put Replica set>); //PHP mongoclient function 
   echo "Connection to database successfully";
     $db = $m->dbname;  //put DB name
      $collection = $db->profile;

$document = array( 
                  "name" => $_REQUEST['name'], 
                  "email" => $_REQUEST['email'], 
                  "age" => $_REQUEST['age'],
                  "address" => $_REQUEST['address'],
                  "comment"=> $_REQUEST['comment']

               );

              // print_r($document); die;
             //echo $_REQUEST['pfid'];   
             $filter=array('_id'=>new MongoID( $_REQUEST['pfid'] ));
             $update=array('$set'=>$document);
    $collection->update( $filter, $update);