MongoDB 更新ドキュメントは 2 つのカテゴリに分類されます:
ドキュメント置換、古いドキュメントを新しいドキュメントで完全に置き換えます
Modifier、一部のドキュメントを変更する
ドキュメント置換
ドキュメント置換の使用は非常に簡単です。デモを見てみましょう。
$collect->insertOne(['name' => 'lakers', 'nums'=> 16]); $collect->replaceOne( ['name'=>'lakers'], ['name' => 'heat', 'nums'=>3] );
修飾子を使用して、キーの変更、追加、削除など、より複雑な更新操作を完了します。
"$set" 修飾子
"$set" は、フィールドの値を指定するために使用されます。このフィールドが存在しない場合は作成します。
$collect->insertOne([ 'name' => 'james', 'age' => 35, ]); $collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => 'apple']] ); // fruit字段不存在,则会创建该字段
今のリンゴが気に入らず、イチゴに変更したい場合は、
$collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => 'strawberry']] );
"$set" でキーの種類を変更することもできます。
# 不止喜欢草莓,还喜欢梨子、香蕉。 $collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => ['strawberry', 'banana', 'pear'] ] ] );
"$set" は埋め込みドキュメントも変更できます
$collect->insertOne([ 'name' => 'james', 'age' => 35, 'brothers' => ['name' => 'wade', 'age'=> 38] ]); $collect->updateOne(['name'=>'james'], ['$set' => ['brothers.name' => 'paul'] ] );
"$unset"Modifier
Use" $ unset" 修飾子は、指定されたフィールドを削除できます
$collect->updateOne(['name'=>'james'], ['$unset' => ['brothers' => ''] ] );
"$inc" 修飾子、値を増減させることができます
および "$set" のように修飾子。フィールドが存在しない場合は、自動的に作成されます。注: このフィールド値には数値のみを使用できます。
$collect->updateOne(['name'=>'james'], ['$inc' => ['scores' => 61] ] ); ## 现有积分61
これで10ポイント獲得できました。
$collect->updateOne(['name'=>'james'], ['$inc' => ['scores' => 10] ] ); ## 现有积分71
後で、50 ポイントが使用されました
$collect->updateOne(['name'=>'james'], ['$inc' =>['scores' => -50] ] ); ## 现有积分21
Array Modifier
MongoDB は、配列メソッドに特別な変更を提供します。
"$push" は要素を追加します
"$push" は配列に要素を追加できます。配列が存在しない場合は、自動的に配列を作成します。記事データを保存するために使用されるドキュメントがあります:
$collect->insertOne([ '_id' => 1, 'title'=>'study mongodb', 'create_time' => '2020-08-24 12 :31' ]); $push = ['$push' => ['comments' => 'comments1'] ]; $collect->updateOne(['_id' => 1 ], $push);
"$each" は複数の要素を追加します
'$push' は、 array at Once 要素、複数の要素を一度に追加したい場合は、'$each' を一緒に使用する必要があります。
$push = [ '$push' => ['comments' => ['$each' => ['comment1', 'comment2', 'comment3']] ] ]; $collect->updateOne(['_id' => 1 ], $push);
「$slice」は n 個の要素を保持します
「$push」は「$slicet」と一緒に使用され、最新の n 個の要素が保持されますデータ、'$slice' の値は負の整数のみです。たとえば、最新の 3 件のコメントのみを保持したいとします。
# 目前数据如下 > db.users.find() { "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment1", "comment2", "comment3", "comment4", "comment5", "comment6" ] }
$push = [ '$push' => [ 'comment' => [ '$each' => ['comment7', 'comment8', 'comment9'], '$slice' => -3 ], ], ]; $collect->updateOne(['_id' => 1 ], $push);
# 现数据如下 db.users.find() { "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment7", "comment8", "comment9" ] }
"$sort"sorting
は '$ とともに使用することもできます。並べ替え」では、「いいね!」が最も多かった 3 つのコメントを保持します。
# 目前是集合内是空的,么有任何文档 $collect->insertOne(['_id' => 1, 'title'=>'study mongodb', 'create_time' => '2020-08-24 12:31']); $push = [ '$push' => [ 'comment' => [ '$each' => [ ['comment' => 'php', 'like' => 100], ['comment' => 'mysql', 'like' => 10], ['comment' => 'linux', 'like' => 200], ['comment' => 'java', 'like' => 1000], ['comment' => 'nginx', 'like' => 300], ['comment' => 'composer', 'like' => 500], ], '$slice' => -3, '$sort' => ['like' => 1] ], ], ];
コレクション内のデータがどのようなものかを見てみましょう:
> db.users.find() { "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ { "comment" : "nginx", "like" : 300 }, { "comment" : "composer", "like" : 500 }, { "comment" : "java", "like" : 1000 } ] }
「$slice」または「$sort」と「$push」だけを使用することはできないことに注意してください。 "、"$each" を使用する必要があります。
「$addToSet」は重複データの挿入を回避します
「$addToSet」を使用して新しい配列要素を追加する場合、重複データの挿入を回避できます。
$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear'] ]); $update = [ '$addToSet' => [ 'fruits' => 'apple' ] ];
などの重複データを追加すると、apple がすでに存在するため、上記の変更は成功しません。 「$addToSet」を「$each」と一緒に使用して、複数の配列要素を挿入することもできます。
$update = [ '$addToSet' => [ 'fruits' => [ '$each' => ['apple', 'banana', 'orange'] ] ] ]; $collect->updateOne(['_id' => 1], $update);
要素の削除
「$pop」を使用して、左端または右端の要素を削除できます。
$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear'] ]); #从数组末删除1个元素 $update = [ '$pop' => [ 'fruits' => 1 ] ]; $collect->updateOne(['_id' => 1], $update); # 从数组头删除一个元素 $update = [ '$pop' => [ 'fruits' => -1 ] ]; $collect->updateOne(['_id' => 1], $update);
「$pull」を使用して指定した要素を削除することもできます
$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear', 'apple', 'banana', 'orange'] ]); #从数组末删除 $update = [ '$pull' => [ 'fruits' => 'apple' ] ];
配列内のすべてのリンゴ要素が削除されました
upsert
upsert は特別な種類の更新です。ただし、条件を満たすセットが見つかった場合は、前回の変更と同じになります。条件を満たすコレクションが見つからない場合は、クエリ条件と変更されたドキュメントを使用して、新しいドキュメントとしてコレクションに挿入されます。
以下では、よく遭遇するシナリオを例として取り上げます。各 IP が表示された回数を記録します。新しい IP の場合はコレクションに追加され、既に存在する場合は元のコレクションが変更されます。
$collect->updateOne(['ip' => '116.31.23.1'], [ '$inc' =>[ 'views' => 1 ] ], ['upsert' => true]); $collect->updateOne(['ip' => '127.0.0.1'], [ '$inc' =>[ 'views' => 1 ] ], ['upsert' => true]); $collect->updateOne(['ip' => '116.31.23.1'], [ '$inc' =>[ 'views' => 1 ] ], ['upsert' => true]);
> db.users.find() { "_id" : ObjectId("5f4336f3a95f1a505db9a2df"), "ip" : "116.31.23.1", "views" : 2 } { "_id" : ObjectId("5f4336f3a95f1a505db9a2e1"), "ip" : "127.0.0.1", "views" : 1 }
複数のドキュメントを更新する
複数のドキュメントを更新するには、次に示すように、updateMany() メソッドを使用する必要があります。
以上がMongoDBドキュメントの更新(phpコード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。