MongoDB

解決問題 MongoDB (2)

教學目標

主要解決如何在 Python 中使用 MongoDB 資料庫的問題。

重點概念

首先我們要如何在 Python 中使用 MongoDB 資料庫,主要是透過 pymongo 模組進行操作,在此之前我們必須先了解 MongoDB 與 SQL 的名詞和概念對應,請參考下表。

SQL 名詞和概念 MongoDB 名詞和概念
Database Database
Table Collection
Row Document
Column Field
Index Index
primary key primary key

接著我們若要使用 MongoDB 資料庫,則必須先了解基本 CRUD 也就是新增、讀取、更新和刪除的操作,但是對於資料庫操作大多數人主要還是熟悉 SQL 語法,所以我們透過 SQL 進行對應,以利快速了解使用。

建立資料表

SQL 語法

1
2
3
4
5
6
7
8
CREATE TABLE people (
id MEDIUMINT NOT NULL
AUTO_INCREMENT,
user_id Varchar(30),
age Number,
gender char(1),
PRIMARY KEY (id)
)

MongoDB 語法

1
2
3
4
5
6
db.createCollection("people")
db.people.insertOne( {
user_id: "Winnie",
age: 25,
gender: "F"
} )

建立資料

SQL 語法

1
2
3
4
5
6
INSERT INTO people(user_id,
age,
gender)

VALUES ("Jack",
25,
"M")

MongoDB 語法

1
2
3
db.people.insertOne(
{ user_id: "Jack", age: 25, status: "M" }
)

查詢資料

SQL 語法

1
2
3
SELECT user_id, status
FROM people
WHERE gender= "F"

MongoDB 語法

1
2
3
4
db.people.find(
{ gender: "F" },
{ user_id: 1, status: 1, _id: 0 }
)

更新資料

SQL 語法

1
2
3
UPDATE people
SET age = age + 1
WHERE gender = "M"

MongoDB 語法

1
2
3
4
db.people.updateMany(
{ gender: "M" } ,
{ $inc: { age: 1 } }
)

刪除資料

SQL 語法

1
2
DELETE FROM people
WHERE status = "M"

MongoDB 語法

1
db.people.deleteMany( { gender: "M" } )

再來我們了解 MongoDB 基本的 CRUD 操作之後,此時就能夠開始在 Python 中透過 pymongo 模組使用 MongoDB 資料庫。

安裝 pymongo 模組

1
$ pip install pymongo

建立 MongoDB 資料庫連線

1
2
from pymongo import MongoClient
client = MongoClient('localhost', 27017)

取得 MongoDB 資料庫實體

1
db = client['test-database']

取得 MongoDB 資料庫集合

1
collection = db.test_collection

新增文件至資料庫中

1
2
3
4
5
posts = db.posts
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"]}
posts.insert_one(post)

取得資料庫中文件內容

1
2
import pprint
pprint.pprint(posts.find_one({"author": "Mike"}))

更新資料庫中文件內容

1
2
posts = db.posts
posts.update_one({"_id":_id},{"$set": {"text": "My first blog post! (Update)"}})

刪除資料庫中文件內容

1
2
posts = db.posts
posts.delete_one({"_id":_id})

最後我們了解如何在 Python 中透過 pymongo 模組使用 MongoDB 資料庫之後,下一步就是開始撰寫適當的 Python 程式語言針對不同的問題進行解決。

總結目前有許多開源專案皆是採用 MongoDB 資料庫為預設資料庫,此時我們就需要了解如何使用 MongoDB 資料庫,但是 MongoDB 資料庫的概念與 SQL 的概念有些不同必須先行了解,才能夠有效進行後續的管理與應用。

相關資源

解決問題 MongoDB (1)

教學目標

主要解決 MongoDB 無法正常啟動的問題。

重點概念

首先若是 MongoDB 非正常關閉,則會發生下述錯誤原因。

1
2

child process failed, exited with error number 1

接著我們可以透過下述刪除記錄檔和修復資料庫的步驟解決此問題。

刪除記錄檔

1
2
$ rm -rf logs/
$ touch logs

修復資料庫

1
$ ./usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --repair

再來我們嘗試重新啟動 MongoDB 資料庫,只要出現「child process started successfully, parent exiting 」訊息即代表啟動成功。

啟動資料庫

1
2
3
4
5
6
7
$ rm -rf log*
$ pkill mongo
$ pkill mongod
$ ./usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --fork
about to fork child process, waiting until server is ready for connections.
forked process: 2345
child process started successfully, parent exiting

最後我們透過 MongoDB 客戶端工具嘗試連線 MongoDB 資料庫進行驗證。

驗證資料庫

1
$ ./usr/local/mongodb/bin/mongo

總結當我們開啟 MongoDB 資料庫發生「ERROR: child process failed ,exited with error number 1」錯誤問題時,只需透過簡單的步驟就能夠重新啟動 MongoDB 資料庫。

相關資源

2014Q4 工作心得 (3)

評估和導入前端應用的新技術和工具,今年初我們開始導入 Node.js 和 AngularJS 進行 Single Page Application 開發,就能解決大部份公司所面臨的問題,可是當專案越來越大,此時 AngularJS 效能和維護就會是大問題,因此我開始嘗試找解決的方案,React.js 單向資料流相較於 AngularJS 雙向資料綁定,資料處理架構更加明暸簡單,此外 React.js 的 Virtual DOM 更讓效能相關於 AngularJS 有明顯的差別,此外 React.js 搭配 jQuery 套件從無到有實際開發出呈現資料表格的網站,意外的非常簡單易懂,所以目前已經有部份專案的部份元件已經開始採用 React.js 進行開發。

調整和升級後端伺服器的應用,今年中我們開始導入 Sails.js 和 MongoDB 進行資料即時儲存的管理,像是推播通知系統如何儲存使用者的 Device Token 和 Register ID ,可是當資料量越來越大時,存取效能和穩定運作就會開始產生問題,因此我開始嘗試找解決的方案,Google BigQuery 提供的串流資料和 SQL 查詢就能解決資料即時儲存的管理,但是並非所有需求皆能解決,像是推播排程需要 CRUD 的功能,此時 MongoDB 就比 Google BigQuery 更適合,可是當需求為直接即時新增使用者資料,接著透過 Google BigQuery 在適當的時機透過 SQL 查詢篩選出符合條件的使用者資料,此時 Google BigQuery 就比 MongoDB 更適合,所以目前已經有部份專案依據需求的適切性開始轉移 Google BigQuery 進行管理。

最後資料呈現的方式,目前主要是透過 Google Docs 排程取得 Amazon RDS 、 MongoDB 、 Google BigQuery 和 Google Analytics 的資料進行整合產生業務專用的數據表格,下一步針對圖表的需求,要能讓業務根據樣本資料拉出需要的圖表,同時又能讓工程師直接實作出被需要的圖表,因此我開始嘗試找解決的方案,Plotly 是個圖表呈現的線上服務,除了能讓業務根據樣本資料拉出需要的圖表,又能讓工程師直接實作出被需要的圖表,並且搭配 Node.js 就能與 Google BigQuery 進行自動化的整合,此外業務要如何存取 Google BigQuery 的資料呢? IPython Notebook 是個筆記本的網站服務,能夠以筆記本的方式描述資料如何存取,以及透過 Python 指令直接直接執行程式碼存取 Google BigQuery 的資料,以及進行基本的資料分析與統計應用,所以目前已經開始在規劃 Plotly 和 IPython Notebook 詳細的整合應用標準操作流程 (Standard Operating Procedure, SOP)。

Node.js 即時處理 (2)

教學目標

透過 sails 套件自動產生搭配資料庫基本操作的即時處理 API 。

前置作業

  1. 完成 Node.js 套件安裝與設置。
  2. 完成 MongoDB 和 MySQL 兩種資料庫安裝與設置。
  3. 在資料庫中建立 user 資料表,其中包括數值型態 id 欄位和字串型態 name 欄位。

套件安裝

1
2
3
$ npm install sails --save
$ npm install sails-mongo --save
$ npm install sails-mysql --save

使用教學

建立專案

1
$ sails new appProject

建立使用者的 RESTful API。

1
2
$ cd appProject
$ sails generate model user

設定資料庫 - MongoDB

Adapter

1
2
$ cd appProject/config
$ vi adapters.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module.exports.adapters = {
mongo: {
module : 'sails-mongo',
host : '伺服器位址',
port : 27017,
user : '使用者名稱',
password : '使用者密碼',
database : '資料庫名稱'
},
disk: {
module: 'sails-disk'
},
'default': 'disk',
}

Model

1
2
$ cd api/models
$ vi User.js
1
2
3
4
5
6
7
8
9
10
11
module.exports = {
adapter: 'mongo',
attributes: {
id: {
type: 'integer'
},
name: {
type: 'string'
}
}
};

設定資料庫 - MySQL

Adapter

1
2
$ cd appProject/config
$ vi adapters.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
module.exports.adapters = {
mysql: {
module : 'sails-mysql',
host : '伺服器位址',
port : 3306,
user : '使用者名稱',
password : '使用者密碼',
database : '資料庫名稱'
},
disk: {
module: 'sails-disk'
},
'default': 'disk'
}

Model

1
2
$ cd api/models
$ vi User.js
1
2
3
4
5
6
7
8
9
10
11
module.exports = {
adapter: 'mysql',
attributes: {
id: {
type: 'integer'
},
name: {
type: 'string'
}
}
};

啟動專案

1
2
$ cd appProject
$ sails lift

在瀏覽器網址列輸入 http://localhost:1337/user ,就能開始使用所建立好的使用者 RESTful API 同步存取資料庫中的資訊。

相關資源

Node.js 資料庫處理 (2)

基本介紹

教學目標

透過 Node.js 進行 MongoDB 資料庫的基本操作。

前置作業

  1. 完成 Node.js 套件安裝與設置。
  2. 完成 MongoDB 資料庫安裝與設置。

套件安裝

1
$ npm install mongodb --save

使用教學

程式碼一開始必須建立資料庫連線,待資料處理完成之後,更要記得關閉資料庫。

建立連線

1
2
3
4
5
6
7
8
9
10
11
12
var mongo = require('mongodb').MongoClient;

var host = '伺服器位址';
var user = '使用者名稱';
var password = '使用者密碼';
var database = '預設資料庫';

mongodb.connect('mongodb://' + host + ':27017/' + database , function(err, db) {
if (err) {
throw err;
}
});

資料庫基本操作有建立 (Create) 、 讀取 (Read) 、 更新 (Update) 、 刪除 (Delete) 等四項,簡稱 CRUD。

建立資料

1
2
3
4
5
6
7
8
9
10
11
12
var table = '預設資料表';
var collection = db.collection(table);
var data = {
'id':1,
'name':'leo yeh'
};
collection.insert(data, {w:1}, function(err, results) {
if (err) {
throw err;
}
console.log(results);
});

讀取資料

1
2
3
4
5
6
7
8
var table = '預設資料表';
var collection = db.collection(table);
ccollection.find().toArray(function(err, items) {
if (err) {
throw err;
}
console.log(items);
});

更新資料

1
2
3
4
5
6
7
8
9
10
11
12
var table = '預設資料表';
var collection = db.collection(table);
var data = {
'id':1,
'name':'Leo Yeh'
};
collection.update({id: data.id}, {$set:{name: data.name}}, {w:1}, function(err, results) {
if (err) {
throw err;
}
console.log(results);
});

刪除資料

1
2
3
4
5
6
7
8
9
10
11
12
var table = '預設資料表';
var collection = db.collection(table);
var data = {
'id':1,
'name':'Leo Yeh'
};
collection.remove({id: data.id}, {w:1}, function(err, results) {
if (err) {
throw err;
}
console.log(results);
});

註: MongoDB 有 Write Concern 設置,主要是確保寫入操作的可靠性,預設是 {w:1} 。

關閉連線

1
mongodb.close();

相關資源