2017-07-07 3 views
1

私は外部ソースからPHPでmongodbにデータをインポートしようとしています。外部データからのすべての行は1つのmongodbドキュメントです。すべての行には、uidという一意のIDがあります。MongoDBとPHPで多くの文書をアップします

私は次のことを試しています:同じ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

https://meta.stackexchange.com/questions/39223/one-post-with-multiple-questions-or-multiple-posts#answer-39224 –

+0

しかし、基本的に両方の質問がつながっています。私は質問1を除いて質問2を解決することはできません。 – bernhardh

+0

あなたはそれらを解決することはできません、どの順序で問題ではありません。それ以外の場合は、両方の権利を求めることはありませんか?推奨事項を尊重することは傷つきませんが、回答の可能性を高める可能性があります。 –

答えて

0

質問は完全に独立しています。

最初:代わりにupdateOne

(デフォルト)multi: falseで使用update。前者はreplaces an existing document entirelyです。

updateMany

は、このように動作しません。 updatemulti: trueのようになります。フィルタに一致するすべてのドキュメントに更新操作を適用します。 upsert: true the filter fields should be uniquely indexed to avoid multiple upsertsと使用した場合。あなたが一度に個々のフィルタで複数​​のアップサートを実行したい場合は

、あなたは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); 

一括操作の制限のための最後のリンクの後ろのページをお読みください。

関連する問題