php mongodb updateMany ordered false 无效
php mongodb updateMany ordered false not working
我有这个查询,但仍然得到 E11000 duplicate key error collection
错误
$collection->insertMany($allData,['ordered' => false]);
MongoDB: 4.4, php 驱动版本: 1.12.0
----------------------------更新---------- ------------------
根据dododo的回答(和评论),所有文档都会插入成功,但最后会出现重复错误。
换句话说,这段代码将在不终止应用程序的情况下插入所有文档:
try{
$collection->insertMany($allData,['ordered' => false]);
}catch(Exception $e){
echo "Some documents are duplilcate but everthing ok.."
}
错误很明显。
在数组 $allData 和 table 内容之间有重复的键。
原因:空 Table
假设您的数据库 table 是:
_id | created_at | updated_at | value
其中 _id
是您在数据库中的主键。
你的 $allData 是
$allData = [
['_id' => 1, 'value' => 'foo']
['_id' => 2, 'value' => 'bar']
['_id' => 3, 'value' => 'baz']
['_id' => 1, 'value' => 'bal']
];
可以看到,主键插入数据有重复值,值1出现了两次。
这会导致错误。
如果数据库列标有 UNIQUE INDEX
强制值是唯一的,则会发生同样的情况。
转储 $allData 中存在的数据,研究内容,并删除重复项。
原因:填充 table
_id | created_at | updated_at | value
1 | 2022-01-02 | 2022-01-02 | foo
2 | 2022-01-02 | 2022-01-02 | bar
3 | 2022-01-02 | 2022-01-02 | baz
你的 $allData 是
$allData = [
['_id' => 1, 'value' => 'foo']
['_id' => 2, 'value' => 'bar']
['_id' => 3, 'value' => 'baz']
];
发生的情况是,它尝试使用主键 1 向 table 中插入一行。数据库引擎检查具有该值的现有主键。它发现一个存在,因为已经有一行主键为 1。然后它抛出一个错误,它被 php 捕获,然后抛出它自己的异常,最终以你结束。找到重复的密钥。
在这种情况下,使用带有 setOnInsert 修饰符的 upsert 查询。类似于:
$collection->insertMany($allData,[
'ordered' => false,
'upsert' => true,
'$setOnInsert' => ['_id', 'value']
]);
这是文档 here 中提到的预期行为。此外,它与 php 无关,您可以在 shell:
中看到
db.coll.insertMany([{ _id: 1}, {_id : 1}, {_id: 2}], {ordered: false})
失败:
uncaught exception: BulkWriteError({
"writeErrors" : [
{
"index" : 1,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.coll2 index: _id_ dup key: { _id: 1.0 }",
"op" : {
"_id" : 1
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
结果:
MongoDB Enterprise mongos> db.coll.find()
{ "_id" : 1 }
{ "_id" : 2 }
注意有2个插入的文档,{ _id: 1 }
和{ _id : 2 }
的第一次尝试。
我有这个查询,但仍然得到 E11000 duplicate key error collection
错误
$collection->insertMany($allData,['ordered' => false]);
MongoDB: 4.4, php 驱动版本: 1.12.0
----------------------------更新---------- ------------------
根据dododo的回答(和评论),所有文档都会插入成功,但最后会出现重复错误。
换句话说,这段代码将在不终止应用程序的情况下插入所有文档:
try{
$collection->insertMany($allData,['ordered' => false]);
}catch(Exception $e){
echo "Some documents are duplilcate but everthing ok.."
}
错误很明显。
在数组 $allData 和 table 内容之间有重复的键。
原因:空 Table
假设您的数据库 table 是:
_id | created_at | updated_at | value
其中 _id
是您在数据库中的主键。
你的 $allData 是
$allData = [
['_id' => 1, 'value' => 'foo']
['_id' => 2, 'value' => 'bar']
['_id' => 3, 'value' => 'baz']
['_id' => 1, 'value' => 'bal']
];
可以看到,主键插入数据有重复值,值1出现了两次。
这会导致错误。
如果数据库列标有 UNIQUE INDEX
强制值是唯一的,则会发生同样的情况。
转储 $allData 中存在的数据,研究内容,并删除重复项。
原因:填充 table
_id | created_at | updated_at | value
1 | 2022-01-02 | 2022-01-02 | foo
2 | 2022-01-02 | 2022-01-02 | bar
3 | 2022-01-02 | 2022-01-02 | baz
你的 $allData 是
$allData = [
['_id' => 1, 'value' => 'foo']
['_id' => 2, 'value' => 'bar']
['_id' => 3, 'value' => 'baz']
];
发生的情况是,它尝试使用主键 1 向 table 中插入一行。数据库引擎检查具有该值的现有主键。它发现一个存在,因为已经有一行主键为 1。然后它抛出一个错误,它被 php 捕获,然后抛出它自己的异常,最终以你结束。找到重复的密钥。
在这种情况下,使用带有 setOnInsert 修饰符的 upsert 查询。类似于:
$collection->insertMany($allData,[
'ordered' => false,
'upsert' => true,
'$setOnInsert' => ['_id', 'value']
]);
这是文档 here 中提到的预期行为。此外,它与 php 无关,您可以在 shell:
中看到db.coll.insertMany([{ _id: 1}, {_id : 1}, {_id: 2}], {ordered: false})
失败:
uncaught exception: BulkWriteError({
"writeErrors" : [
{
"index" : 1,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.coll2 index: _id_ dup key: { _id: 1.0 }",
"op" : {
"_id" : 1
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
结果:
MongoDB Enterprise mongos> db.coll.find()
{ "_id" : 1 }
{ "_id" : 2 }
注意有2个插入的文档,{ _id: 1 }
和{ _id : 2 }
的第一次尝试。