首頁 > 資料庫 > MongoDB > 主體

MongoDB文件的更新(php程式碼實例)

齐天大圣
發布: 2020-08-24 18:02:10
原創
2131 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!