MongoDB基礎操作
===
---
## 使用Python操作 MongoDB
#### Windows 安裝Python:
https://www.activestate.com/products/activepython/downloads/
#### 安裝PyMongo
```
python3 –m pip install pymongo
# OR
python -m pip install pymongo
```
#### 連接資料庫 http://www.runoob.com/python3/python-mongodb.html
```python
from pymongo import MongoClient
db_name = 'ma324'
collection_name = 'example_data_2'
client = MongoClient("mongodb://localhost:27017/")
database = client[db_name]
collection = database[collection_name]
```
| MongoDB指令 | PyMongo方法 |
| -------- | -------- |
| insertOne | insert_one |
| insertMany | insert_many |
| find | find |
| updateOne | update_one |
| updateMany | insert_one |
| deleteOne | delete_one |
| deleteMany | delete_many |
#### 插入資料
```python
from pymongo import MongoClient
db_name = 'ma324'
collection_name='example_data_2'
client=MongoClient("mongodb://localhost:27017/")
database=client[db_name]
collection=database[collection_name]
collection.insert_many([
{'name':'Carter','age':20,'address':'Hsinchu'},
{'name':'Alice','age':43,'address':'Tainan'},
{'name':'Moqa','age':32,'address':'Taipei'},
{'name':'Yezis','age':34,'address':'Hualien'},
{'name':'Opeqax','age':36,'address':'Taichung'},
{'name':'Ilaz','age':28,'address':'Kaohsiung'},
{'name':'Nbudax','age':23,'address':'NewTaipei'}
])
```
---
日期時間參數: pymongo suggests you should simply use datetime.datetime.utcnow()
請使用 UTC date
>>> result = db.objects.insert_one( ... {"last_modified": datetime.datetime.utcnow()})
Always use datetime.datetime.utcnow(), which returns the current time in UTC, instead of datetime.datetime.now(), which returns the current local time. Avoid doing this:
別使用 now()
>>> result = db.objects.insert_one( ... {"last_modified": datetime.datetime.now()})
---
以電商為例子
```python
# -*- coding: UTF-8 -*-
from pymongo import MongoClient
db_name = 'ma324'
collection_name = 'goods'
client = MongoClient("mongodb://localhost:27017/")
database = client[db_name]
collection = database[collection_name]
collection.insert_many([{
'title': '夏普新HEALSiO水波爐紅',
'descriptions': [
'夏普首創低氧烹調減油減鹽保留食材維生素照顧健康',
'業界唯一真正的過熱水蒸氣水波爐',
'蒸、煎、烤、炸,一機滿足烹調多種口感'
],
'price': 27900,
'discount': 2000,
'combo': [{
'title': '夏普贈品康寧Corningware隨行X杯550ml(星爍藍)★防爆款',
'picUrl': 'https://url.com'
}, {
'title': '贈品美國康寧 VISIONS稜紋鑽石系列。晶鑽鍋0.8L',
'picUrl': 'https://url.com'
}],
'pics':[
'https://e.ecimg.tw/items/DMBJ0LA900A47LS/i010007_1561945152.jpg',
'https://e.ecimg.tw/items/DMBJ0LA900A47LS/i010007_1561945152.jpg'
],
'createdAt': datetime.datetime.utcnow()
}])
```
#### 查詢資料
```python
from pymongo import MongoClient
db_name = 'ma324'
collection_name = 'example_data_2'
client = MongoClient("mongodb://localhost:27017/")
database = client[db_name]
collection = database[collection_name]
rows = collection.find({'age':{'$lt':50,'$gt':26}})
for row in rows:
print row
for row in rows:
print row['_id']
print row['name']
print row['age']
print row['address']
```
#### 修改資料
更新操作可以增加upsert的參數,若該數據存在,則更新,若數據不存在,則創建
注意:若使用這個功能,$set參數要放入完整的檔案內容,應該要包含每一個欄位,而不僅僅是需要更被更新的內容,否則被插入的內容會只有被更新的這幾個欄位。
```python
from pymongo import MongoClient
db_name='ma324'
collection_name='example_data_2'
client=MongoClient("mongodb://localhost:27017/")
database=client[db_name]
collection=database[collection_name]
collection.update_many({'name':'Ubyx'},{'$set':{'address':'Hualien','age':80}}, upsert=True)
```
修改資料的坑:
```python
# 正確的追加方式
rows = collection.update_many({
}, {
'$set': {
'supported_mpayment.GOOGLEPAY': True
}
})
#錯誤的追加方式,會把舊的資料全部覆蓋過去
rows = collection.update_many({
}, {
'$set': {
'supported_mpayment': {
'GOOGLEPAY': True
}
}
})
```
---
#### MongoDB與Python不通用的操作
空值:在MongoDB中,空值叫做null,Python則叫做None
MongoDB不認識None,Python不認識null
布林值:在MongoDB中,真叫做true,假為false,Python則真叫做True,假為False
排序:db.getCollection('example_data_1').find({'age':{'$gt':26}}).sort({'age':-1})
在Python中則為
```python
from pymongo import MongoClient
db_name = 'ma324'
collection_name = 'example_data_2'
client = MongoClient("mongodb://localhost:27017/")
database = client[db_name]
collection = database[collection_name]
rows = collection.find({}).sort('age',-1)
for row in rows:
print(row)
```
查詢”_id”:在Robo3T中,可以根據”_id”的值來查詢文件,此時查詢語法如下:(注意:_id內容請自行更換)舉例:
db.getCollection('example_data_2').find({'_id':ObjectId("5d80a4373bce4e6c8d1a8eb2")})
但在Python中,若安裝完PyMongo的同時,Python會自動安裝一個叫做’bson’的第三方庫,ObjectId會從bson庫中導入:
```python
from pymongo import MongoClient
from bson import ObjectId
db_name = 'ma324'
collection_name = 'example_data_2'
client = MongoClient("mongodb://localhost:27017/")
database = client[db_name]
collection = database[collection_name]
rows = collection.find({'_id':ObjectId('5d80a4373bce4e6c8d1a8eb2')})
for row in rows:
print(row)
```
---
## PHP 使用 MongoDB 基本入門範例
https://www.php.net/manual/en/set.mongodb.php
https://blog.gtwang.org/web-development/php-mongodb-database-tutorial/