Rumah> pangkalan data> MongoDB> teks badan

MongoDB文档的更新(php代码实例)

Michael Jordan
Lepaskan: 2020-08-24 18:02:10
asal
2156 orang telah melayarinya

MongoDB更新文档分为两大类:

  • 文档替换,使用新文档完全替换掉旧文档

  • 修改器,修改部分文档

文档替换

使用文档替换非常的简单,下面来看演示:

$collect->insertOne(['name' => 'lakers', 'nums'=> 16]); $collect->replaceOne( ['name'=>'lakers'], ['name' => 'heat', 'nums'=>3] );
Salin selepas log masuk

使用修改器可以完成更复杂的更新操作,比如修改、增加或删除键。

"$set"修改器

"$set"用来指定一个字段的值。如果这个字段不存在,则创建它。

$collect->insertOne([ 'name' => 'james', 'age' => 35, ]); $collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => 'apple']] ); // fruit字段不存在,则会创建该字段
Salin selepas log masuk

如果现在不喜欢apple,想换成草莓

$collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => 'strawberry']] );
Salin selepas log masuk

"$set"还可以修改键的类型。

# 不止喜欢草莓,还喜欢梨子、香蕉。 $collect->updateOne(['name'=>'james'], ['$set' => ['fruit' => ['strawberry', 'banana', 'pear'] ] ] );
Salin selepas log masuk

"$set"也可以修改内嵌文档

$collect->insertOne([ 'name' => 'james', 'age' => 35, 'brothers' => ['name' => 'wade', 'age'=> 38] ]); $collect->updateOne(['name'=>'james'], ['$set' => ['brothers.name' => 'paul'] ] );
Salin selepas log masuk

"$unset"修改器

使用"$unset"修改器可以删除指定字段

$collect->updateOne(['name'=>'james'], ['$unset' => ['brothers' => ''] ] );
Salin selepas log masuk

"$inc"修改器,增加或减少数值

和"$set"修改器一样,如果该字段不存在则自动创建。注意:该字段值只可以是数字。

$collect->updateOne(['name'=>'james'], ['$inc' => ['scores' => 61] ] ); ## 现有积分61
Salin selepas log masuk

现在,有获得了10点积分。

$collect->updateOne(['name'=>'james'], ['$inc' => ['scores' => 10] ] ); ## 现有积分71
Salin selepas log masuk

后来,用掉了50积分

$collect->updateOne(['name'=>'james'], ['$inc' =>['scores' => -50] ] ); ## 现有积分21
Salin selepas log masuk

数组修改器

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);
Salin selepas log masuk

"$each"添加多个元素

'$push'可以一次数组元素,如果想一次添加多个元素的话,则需要搭配使用'$each'。

$push = [ '$push' => ['comments' => ['$each' => ['comment1', 'comment2', 'comment3']] ] ]; $collect->updateOne(['_id' => 1 ], $push);
Salin selepas log masuk

"$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" ] }
Salin selepas log masuk
$push = [ '$push' => [ 'comment' => [ '$each' => ['comment7', 'comment8', 'comment9'], '$slice' => -3 ], ], ]; $collect->updateOne(['_id' => 1 ], $push);
Salin selepas log masuk
# 现数据如下 db.users.find() { "_id" : 1, "title" : "study mongodb", "create_time" : "2020-08-24 12:31", "comment" : [ "comment7", "comment8", "comment9" ] }
Salin selepas log masuk

"$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] ], ], ];
Salin selepas log masuk

再来看看集合内数据是怎样的:

> 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 } ] }
Salin selepas log masuk

注意不能只将 "$slice" 或者 "$sort" 与 "$push" 配合使用,且必须使用 "$each"。

"$addToSet"避免插入重复数据

使用"$addToSet"新增数组元素时,可以避免添加重复数据,比如

$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear'] ]); $update = [ '$addToSet' => [ 'fruits' => 'apple' ] ];
Salin selepas log masuk

上面的修改不会成功,因为apple已经存在。'$addToSet'也可以和"$each"配合使用,插入多个数组元素。

$update = [ '$addToSet' => [ 'fruits' => [ '$each' => ['apple', 'banana', 'orange'] ] ] ]; $collect->updateOne(['_id' => 1], $update);
Salin selepas log masuk

删除元素

可以通过"$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);
Salin selepas log masuk

还可以通过'$pull'删除指定的元素

$collect->insertOne([ '_id' => 1, 'name' => 'gwx', 'age' => 30, 'fruits' => ['apple', 'pear', 'apple', 'banana', 'orange'] ]); #从数组末删除 $update = [ '$pull' => [ 'fruits' => 'apple' ] ];
Salin selepas log masuk

数组有所有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]);
Salin selepas log masuk
> db.users.find() { "_id" : ObjectId("5f4336f3a95f1a505db9a2df"), "ip" : "116.31.23.1", "views" : 2 } { "_id" : ObjectId("5f4336f3a95f1a505db9a2e1"), "ip" : "127.0.0.1", "views" : 1 }
Salin selepas log masuk

更新多个文档

更新多个文档需要使用updateMany()方法,演示如下:

$collect->insertMany([ ['name' => 'gwx', 'age' => 30], ['name' => 'gwx', 'age' => 30], ['name' => 'gwx', 'age' => 30], ]); $collect->updateMany([ 'name' => 'gwx' ], ['$set' =>['age' => 18]] );
Salin selepas log masuk

Atas ialah kandungan terperinci MongoDB文档的更新(php代码实例). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!