我尝试使用php将数据从外部源导入我的mongodb。外部数据的每一行都是一个mongodb文档。每一行都有一个名为uid的唯一ID。
现在我正在尝试以下操作:如果不存在具有相同uid的文档(Upsert),我想插入一个新行。
对于单个文档,我会执行以下操作:
$collection->updateOne(
["uid" => "2"],
['$set' => [
"newfield" => date("Y-m-d H:i:s"),
"name" => "Test"
]],
[
"upsert" => true
]
);
第1步:
是否可以覆盖整个文档,而不仅仅是设置特定字段?像这样:
$collection->updateOne(
["uid" => "2"],
[
"newfield" => date("Y-m-d H:i:s"),
"name" => "Test"
],
[
"upsert" => true
]
);
这不起作用,因为我收到First key in $update argument is not an update operator
错误。怎么做?
第2步
出于性能原因,我想使用insertMany或updateMany函数批量转发多个文档。
但是updateMany需要什么过滤器:
$db->updateMany(
[???????],
[
"newfield" => date("Y-m-d H:i:s"),
"name" => "XXX"
],
[
"upsert" => true
]
);
答案 0 :(得分:0)
问题是完全独立的。
第一个:
将update与multi: false
(默认值)一起使用,而不是updateOne。前者允许replaces an existing document entirely。
第二个:
updateMany无法正常工作。它更像update multi: true
- 它将更新操作应用于与过滤器匹配的所有文档。与upsert: true
the filter fields should be uniquely indexed to avoid multiple upserts一起使用时。
如果您想一次性使用单个过滤器执行多次upsert,可以使用bulk update:
$bulk = new MongoDB\Driver\BulkWrite(['ordered' => false]);
$bulk->update(["uid" => "2"], [
"newfield" => date("Y-m-d H:i:s"),
"name" => "Test"
]]);
$bulk->update(["uid" => "3"], [
"newfield" => date("Y-m-d H:i:s"),
"name" => "Another Test"
]]);
$bulk->update(["uid" => "4"], [
"newfield" => date("Y-m-d H:i:s"),
"name" => "One more Test"
]]);
$result = $manager->executeBulkWrite('db.collection', $bulk, $writeConcern);
请阅读最后一个链接背后的页面,了解批量操作的限制。