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 }的第一次尝试。