在MongoDB和php中嵌入许多文档

时间:2017-07-07 14:33:07

标签: php mongodb mongodb-php

我尝试使用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
    ]
);

1 个答案:

答案 0 :(得分:0)

问题是完全独立的。

第一个:

updatemulti: 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);

请阅读最后一个链接背后的页面,了解批量操作的限制。