MongoDB更新文件分為兩大類:
文件替換,使用新文件完全替換舊文件
修改器,修改部分文檔
文檔替換
#使用文檔替換非常的簡單,下面來看示範:
$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字段不存在,则会创建该字段
如果現在不喜歡apple,想換成草莓
$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"修改器
使用" $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
#陣列修改器
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'可以一次數組元素,如果想一次添加多個元素的話,則需要搭配使用'$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"排序
還可以搭配'$sort'使用,保留按讚數最多的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' ] ];
陣列有所有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()方法,示範如下:
$collect->insertMany([ ['name' => 'gwx', 'age' => 30], ['name' => 'gwx', 'age' => 30], ['name' => 'gwx', 'age' => 30], ]); $collect->updateMany([ 'name' => 'gwx' ], ['$set' =>['age' => 18]] );
以上是MongoDB文件的更新(php程式碼實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!