MongoDB update documents are divided into two categories:
Document replacement, completely replace the old document with the new document
Modifier, Modify some documents
Document replacement
Using document replacement is very simple, let’s take a look at the demonstration:
$collect->insertOne(['name' => 'lakers', 'nums'=> 16]); $collect->replaceOne( ['name'=>'lakers'], ['name' => 'heat', 'nums'=>3] );
Use modifiers to complete more complex update operations, such as modifying, adding, or deleting keys.
"$set" modifier
"$set" is used to specify the value of a field. If this field does not exist, create it.
$collect->insertOne([ 'name' => 'james', 'age' => 35, ]); $collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => 'apple']] ); // fruit字段不存在,则会创建该字段
If you don’t like apple now and want to change to strawberry
$collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => 'strawberry']] );
"$set" can also modify the key type.
# 不止喜欢草莓,还喜欢梨子、香蕉。 $collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => ['strawberry', 'banana', 'pear'] ] ] );
"$set" can also modify embedded documents
$collect->insertOne([ 'name' => 'james', 'age' => 35, 'brothers' => ['name' => 'wade', 'age'=> 38] ]); $collect->updateOne(['name'=>'james'], ['$set' => ['brothers.name' => 'paul'] ] );
"$unset"Modifier
Use" The $unset" modifier can delete the specified field
$collect->updateOne(['name'=>'james'], ['$unset' => ['brothers' => ''] ] );
"$inc" modifier, increase or decrease the value
and "$set" Like the modifier, if the field does not exist, it will be automatically created. Note: This field value can only be numbers.
$collect->updateOne(['name'=>'james'], ['$inc' => ['scores' => 61] ] ); ## 现有积分61
Now, 10 points have been obtained.
$collect->updateOne(['name'=>'james'], ['$inc' => ['scores' => 10] ] ); ## 现有积分71
Later, 50 points were used
$collect->updateOne(['name'=>'james'], ['$inc' =>['scores' => -50] ] ); ## 现有积分21
Array Modifier
MongoDB provides special modifications for arrays method.
"$push" adds elements
"$push" can add elements to the array. If the array does not exist, it will automatically Create an array. There is now a document used to save article data:
$collect->insertOne([ '_id' => 1, 'title'=>'study mongodb', 'create_time' => '2020-08-24 12 :31' ]); $push = ['$push' => ['comments' => 'comments1'] ]; $collect->updateOne(['_id' => 1 ], $push);
"$each" adds multiple elements
'$push' can be an array at once Element, if you want to add multiple elements at once, you need to use '$each' together.
$push = [ '$push' => ['comments' => ['$each' => ['comment1', 'comment2', 'comment3']] ] ]; $collect->updateOne(['_id' => 1 ], $push);
"$slice" retains n elements
'$push' is used together with '$slicet' to retain the latest n elements Data, the value of '$slice' can only be negative integers. For example, I only want to keep the latest 3 comments:
# 目前数据如下 > 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
can also be used with '$sort' , keep the 3 comments with the most likes.
# 目前是集合内是空的,么有任何文档 $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] ], ], ];
Let’s take a look at what the data in the collection looks like:
> 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 } ] }
Note that you cannot only use "$slice" or "$sort" with "$push", and you must Use "$each".
"$addToSet" avoids inserting duplicate data
When using "$addToSet" to add new array elements, you can avoid adding duplicates Data, such as
$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear'] ]); $update = [ '$addToSet' => [ 'fruits' => 'apple' ] ];
, the above modification will not succeed because apple already exists. '$addToSet' can also be used with "$each" to insert multiple array elements.
$update = [ '$addToSet' => [ 'fruits' => [ '$each' => ['apple', 'banana', 'orange'] ] ] ]; $collect->updateOne(['_id' => 1], $update);
Delete elements
You can delete the leftmost or rightmost element through "$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);
You can also delete the specified element through '$pull'
$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear', 'apple', 'banana', 'orange'] ]); #从数组末删除 $update = [ '$pull' => [ 'fruits' => 'apple' ] ];
All apple elements in the array have been deleted
upsert
upsert is a special kind of update. But if a set that meets the conditions is found, it will be the same as the previous modification. If a collection that meets the conditions is not found, it will be inserted into the collection as a new document using the query conditions and the modified document.
Below, take a scenario we often encounter as an example - recording the number of times each IP is viewed. If it is a new IP, it is added to the collection. If it already exists, the original collection is modified.
$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 }
Update multiple documents
Updating multiple documents requires the use of the updateMany() method, as demonstrated below:
$collect->insertMany([ ['name' => 'gwx', 'age' => 30], ['name' => 'gwx', 'age' => 30], ['name' => 'gwx', 'age' => 30], ]); $collect->updateMany([ 'name' => 'gwx' ], ['$set' =>['age' => 18]] );
The above is the detailed content of Update of MongoDB document (php code example). For more information, please follow other related articles on the PHP Chinese website!