Php MongoDB$set未更新记录
我正在使用PHP PECL扩展测试MongoDB,但是我很难让某个更新查询正常工作。我到处寻找答案,运气不好 我创建了一个基本集合: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
$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)代码>
$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);