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/