PHP mysql_xdevapi扩展:replaceOne()似乎不是幂等的



如果在集合中用文档本身替换文档,则该文档似乎已更改。由于这个问题,我的数据变得不可用。我做错了什么?

<?php
$login = '***removed***';
$pass = '***removed***';
$schema_name = 'dev';
$collection_name = 'test';
$session    = mysql_xdevapigetSession("mysqlx://$login:$pass@localhost");
$schema     = $session->getSchema($schema_name);
$collection = $schema->getCollection($collection_name);
// Delete all documents in the collection.
$collection->remove('true')->execute();
// Add one document and get its ID.
$result = $collection->add('{ "accent": "u00e8" }')->execute();
$ids = $result->getGeneratedIds();
$doc_id = $ids[0];
// Read the document from the database.
$row = $collection->getOne($doc_id);
print "1st getOne() : " . $row['accent'] . "n";
// Replace the document with itself.
$collection->replaceOne($doc_id, $row);
// Read the document from the database again.
$row = $collection->getOne($doc_id);
print "2nd getOne() : " . $row['accent'] . "n";
// One more time.
$collection->replaceOne($doc_id, $row);
$row = $collection->getOne($doc_id);
print "3rd getOne() : " . $row['accent'] . "n";
?>

上述脚本的输出:

$ php test.php 
1st getOne() : è
2nd getOne() : u00e8
3rd getOne() : \u00e8

我使用的是PHP v7.3.19和mysql_xdevapi v8.0.22。

可能是转换问题。正如您在文档中看到的,add和replaceOne方法接受集合Object或JSON文档:

https://www.php.net/manual/en/mysql-xdevapi-collection.add.phphttps://www.php.net/manual/en/mysql-xdevapi-collection.replaceone.php

在您的示例中,您在add方法中使用了一个JSON文档,但当您使用getOne方法检索该文档时,结果是一个集合Object:https://www.php.net/manual/en/mysql-xdevapi-collection.getone.php

最后,当您尝试更新它时,您使用以前生成的集合对象,并且集合对象和JSON对象的行为不同。

为了实现您想要的目标,我建议您使用Collection对象而不是JSON对象创建第一个注册表,这样可以避免在检索dada时出现字符集或转换问题。好看!

示例:['重音'=>'\u00e8']

相关内容

  • 没有找到相关文章

最新更新