MongoDB使用教程

做者 changhao
郵箱 <wu_chang_hao@qq.com>
版本 1.0

知識點

  • Mongodb安裝
  • mongo命令使用
  • mongo基礎操做
  • pymongo 模塊使用

Mongodb安裝

windows 安裝方式

1). 下載安裝包html

MongoDB 提供了可用於 32 位和 64 位系統的預編譯二進制包,你能夠從MongoDB官網下載安裝,MongoDB 預編譯二進制包下載地址:https://www.mongodb.com/downl...python

2). 安裝mysql

指定安裝路徑,我這裏安裝在D:\software\mongodb,添加D:\software\mongodb\bin到環境變量中。正則表達式

3). 新建目錄與文件夾sql

D:\software\mongodb\data\db
D:\software\mongodb\log\mongod.log

4). 新建配置文件D:\software\mongodb\mongod.cfgmongodb

systemLog:
  destination: file
  path: "D:/software/mongodb/log/mongod.log"
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: "D:/software/mongodb/data/db"
net:
  bindIp: 0.0.0.0
  port: 27017
setParameter:
  enableLocalhostAuthBypass: false

5). 製做系統服務shell

mongod --config "D:\software\mongodb\mongod.cfg" --bind_ip 0.0.0.0 --install

或者直接在命令行指定配置數據庫

mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\software\mongodb\log\mongod.log --logappend --dbpath    D:\software\mongodb\data\db --serviceName "mongodb" --serviceDisplayName "mongodb" --install

6). 啓動MongoDB服務windows

net start MongoDB
net stop MongoDB

7). 登陸MongoDB服務器

mongo
連接:http://www.runoob.com/mongodb/mongodb-window-install.html
  當沒有帳號密碼登陸的時候,默認就是管理員登陸。,由於剛剛作系統服務install的時候沒有指定
  --auth(沒有指定則沒有權限認證這一說),(至關於mysql跳過受權表啓動同樣)

8). 建立有權限的用戶

use admin
db.createUser(
    {
        user: "root",  # 這個root能夠隨便寫
        pwd: "123",
        roles: [{role: "root", db: "admin"}]  # 權限,role是root說明是管理員,
    }
)

use test
db.createUser(
    {
        user: "test",
        pwd: "123",
        roles: [
        {role: "readWrite", db: "test"},  # 針對test庫有讀寫權限,操做本身的庫有讀寫權限
        {role: "read", db: "db1"}
        ]  # 針對db1庫讀權限,操做其餘庫有讀權限
    }
)

9). 重啓數據庫

mongod --remove
mongod --config "D:\software\mongodb\mongod.cfg" --bind_ip 0.0.0.0 --install --auth

# 或者
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\software\mongodb\log\mongod.log --logappend --dbpath
D:\software\mongodb\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install --auth

10). 從新登陸

# 方式一
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"
# 方式二:在登陸以後用db.auth("帳號","密碼")登陸
mongo
use admin
db.auth("root","123")

Linux 安裝方式

1). 安裝依賴

yum install -y libcurl openssl

2). 下載MongoDB源碼安裝或yum管理器安裝

# mongodb源碼下載地址
https://www.mongodb.com/download-center#community

# 或yum 安裝
yum install -y mongodb

3). 建立數據庫目錄

# 建立目錄,並設置用戶權限
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb
chown `whoami` /var/lib/mongo
chown `whoami` /var/log/mongodb

4). 配置mongo服務參數, 容許全部ip訪問

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --bind_ip_all --fork

5). 或者修改配置文件 /etc/mongod.conf

# mongod.conf
  
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: true


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

6). 後臺啓動

mongod -f /etc/mongod.conf &

7). 登陸mongodb

# 登陸
mongo

# 建立數據庫 test
use test

# 查看當前的數據庫
db

mongo命令使用

# 鏈接到任何數據庫config
mongo 127.0.0.1:27017/config

# 不鏈接任何數據庫
mongo --nodb

# 啓動以後,在須要時運行new Mongo(hostname)命令就能夠鏈接到想要的mongod了
conn = new Mongo('127.0.0.1:27017')
db = conn.getDB('admin')

# 顯示當前數據庫全部的數據庫
show databases   或者  show dbs

# 使用某個數據庫,不存在則建立
use database

# 刪除數據庫
db.dropDatabase()

mongo基礎操做

在MongoDB中相關術語的解釋和sql術語對應關係

SQL術語 MongoDB術語 解釋/說明
database database 數據庫
table collection 數據庫表/集合
row document 數據庫記錄行/文檔
column field 數據字段/域
index index 索引
table joins 錶鏈接,MongoDbB不支持
primary key primary key 主鍵,MongoDB自動將_id字段設置主鍵

有一些數據庫名是保留的,能夠直接訪問這些特殊做用的數據庫

  • admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承全部數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,好比列出全部的數據庫或者關閉服務器。
  • local: 這個數據永遠不會被複制,能夠用來存儲限於本地單臺服務器的任意集合
  • config: 當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。

集合(表)的增刪改

use test
# 增長表內容
db.table1.insert({"a":1})
db.table2.insert({"b":2})

# 查看錶
show collections  或者 show tables

# 刪除
db.user.info.help()  # 查看幫助
db.user.info.drop()

# 幫助, 不明白就help()
db.table.help()     # 舉例

增長操做

# 插入單條數據
user0 = {
    "name": "changhao",
    "age": "23",
    "hobbies": ['music', 'read', 'dancing'],
    "addr": {
        "country": 'China',
        "city": 'BJ',
    }
}
# 方式一
db.table1.insert(user0)
# 方式二
db.table1.insertOne(user0)

# 插入多條數據
user1 = {
    "_id": 1,
    "name": "changhao1",
    "age": "23",
    "hobbies": ['music', 'read', 'dancing'],
    "addr": {
        "country": 'China',
        "city": 'BJ',
    }
}

user2 = {
    "_id": 2,
    "name": "changhao2",
    "age": "23",
    "hobbies": ['music', 'read', 'dancing'],
    "addr": {
        "country": 'China',
        "city": 'BJ',
    }
}
# 方式一
db.table1.insertMany(user1, user2)
# 方式二
db.table1.insertMany([user1, user2])

查找操做

# 查看全部記錄
db.table1.find()

# 美化輸出
db.table1.find().pretty()

# 查找符合條件的全部
db.table1.find({"name": "changhao"})

# 查找符合條件的第一條
db.table1.findOne({"name": "changhao"})

條件查找-比較運算

# id = 1
db.table1.find({"_id":1})

# id != 1
db.table1.find({"_id": {"$ne": 1}})

# id < 2
db.table1.find({"_id": {"$lt": 1}})

# id > 1
db.table1.find({"_id": {"$gt": 1}})

# id >= 1
db.table1.find({"_id": {"$gte": 1}})

# id <= 2
db.table1.find({"_id": {"$lte": 1}})

條件查找-邏輯運算

#邏輯運算:$and,$or,$not
# id >=3 and id <= 4
db.table1.find({"_id": {"$gte":3, "$lte":4}})

# id >=3 and id <=4 and age >=40
db.table1.find({
    "_id":{"$gte":3,"$lte":4},
    "age":{"$gte":40}
})
或者
db.table1.find({"$and":[
    {"_id":{"$gte":3,"$lte":4}},  # 一個字典就是一個條件
    {"age":{"$gte":40}}
]})

# id >=0 and id <=1 or id >=4 or name = "changhao"
db.table1.find({"$or": [
{"_id": {"$lte": 1, "$gte": 0}},
{"_id": {"$gte": 4}},
{"name": "changhao"}
]})

# id % 2 = 1  奇數
db.table1.find({"_id": {"$mod": [2, 1]}})

# 偶數, 取反
db.table1.find({"_id": {"$mod": [2, 1]}})

正則匹配

db.table1.find({
    "name":/^jin.*?(g|n)$/i
})

排序、跳過、截取

# 排序, 根據年齡排序, 1位正序, 1位倒序
db.table1.find().sort("age": 1)
# 選取兩條數據
db.table1.find().limit(2)
# 跳過查詢的數據的前2條
db.table1.find().skip(2)
db.table1.sort({"age":-1}).skip(0).limit(2)

記錄修改

語法格式以下

db.collection.update(
    <query>,
    <update>,
    {
        upsert: <boolean>,
        multi: <boolean>,
        writeConcern: <document>
    }
)

參數說明:

  • query: 至關於where條件
  • update: update的對象和一些更新的操做符(如inc...等, 至關於set後面的)
  • upsert: 可選, 默認爲false, 表明若是不存在update的記錄不更新也不插入,設置爲true表明插入。
  • multi: 可選,默認false,表明只更新找到的第一條記錄,設置true, 表明更新找到的所有記錄。
  • writeConcern:可選, 拋出異常的級別。

實戰語句

# 1.覆蓋式
db.table1.update({'age': 20}, {"name": "changhao"})

# 2. 這一種簡單的更新,徹底替換匹配
var obj = db.table1.findOne({"_id": 2})
obj.username = obj.name + 'test'
obj.age = 23
db.table1.update({"_id": 1}, obj)

設置

# 設置 $set
一般文檔只會有一部分須要更新。可使用原子性的更新修改器,指定對文檔中的某些字段進行更新。
更新修改器是種特殊的鍵,用來指定複雜的更新操做,好比修改、增長後者刪除

# set  name="changhao" where id = 2
db.table1.update({'_id': 2}, {"$set": {"name": "changhao", "age": 23}, {"upsert":true})

# 沒有匹配成功則新增一條{"upsert":true}
db.table1.update({'_id':2},{"$set":{"name":"changhao", "age":23}},{"upsert":true})

# 默認只改匹配成功的第一條,{"multi":改多條}
db.table1.update({'_id':{"$gt":4}},{"$set":{"age":28}})
db.table1.update({'_id':{"$gt":4}},{"$set":{"age":38}},{"multi":true})

# 修改內嵌文檔,把名字爲test的人所在的地址國家改爲Japan
db.table1.update({'name':"test"},{"$set":{"addr.country":"Japan"}})

# 把名字爲test的人的地2個愛好改爲piao
db.table1.update({'name':"test"},{"$set":{"hobbies.1":"piao"}})

# 刪除test的愛好,$unset
db.table1.update({'name':"test"},{"$unset":{"hobbies":""}})

增長和減小

# 增長和減小 $inc
# 1.全部人年齡增長一歲
db.table1.update({},
    {
        "$inc":{"age":1}
    },
    {
        "multi":true
    }
)
# 2.全部人年齡減小5歲
db.user.update({},
    {
        "$inc":{"age":-5}
    },
    {
        "multi":true
    }
)

刪除

# 刪除多箇中的第一個
db.table1.deleteOne({"age":8})

# 刪除國家爲China的所有
db.table1.deleteMany({"addr.country": "China"})

pymongo 模塊使用

鏈接數據庫

import pymongo
client = pymongo.MongoClient("192.168.158.137", 27017)
# 顯示服務器上的全部數據庫
dblist = client.database_names()

print(dblist)
# 打印信息:['admin', 'config', 'local', 'test']

# 鏈接數據庫,獲取庫,若是庫名存在,則使用,不存在建立
db = client['test']

增長數據庫內容

# 增長單條
mydict = {"name": "changhao001", "age": 23}
res = db.table1.insert_one(mydict)
print(res.inserted_id)                # 返回ObjectId對象

# 增長多條
mylist = [{"name": "changhao002", "age": 23}, {"name": "changhao003", "age": 23}]
res = db.table1.insert_many(mylist)
print(res.inserted_ids)                # 返回ObjectId對象列表

查詢語句

查詢一條語句

# 查詢一條數據
res1 = db.table1.find_one({'name': 'changhao1'})
print(res1.items())             # 查看匹配的數據內容

查詢集合中的全部數據或多條

# 查詢集合中的全部數據或多條
res2 = db.stu.find({})          # 查詢全部記錄
res3 = db.stu.find({"age": 23})

高級查詢

# 年齡大於20歲的
myquery = {"age": {"$gt": 20}}
res = db.table1.find(myquery)

正則表達式查詢

# 讀取 name 字段中第一個字母爲 "c" 的數據
myquery = {"name": {"$regex": "^c"}}
res = db.table1.find(myquery)
# 遍歷出匹配的數據
for x in res: print(x)

查詢結果排序,跳過, 截取條數

# 查詢結果的排序,跳過,和截取
sort_res = list(db.table1.find().sort("age", pymongo.DESCENDING))   # 查詢全部結果,並根據年齡的降序排序
skip_res = list(db.table1.find().skip(2))                           # 查詢全部結果,並過濾掉前兩條
limit_res = list(db.table1.find().limit(2))                         # 查詢全部結果,並截取前兩條

# 分頁效果
pagination_res = list(db.table1.find().sort("age", pymongo.DESCENDING).limit(2).skip(2))

修改語句

# 查詢到直接更新設置值
res = db.table1.update_one({'_id': 1}, {"$set": {"name": "changhao_update"}})
print(res.modified_count)

# 查詢到記錄, 在字典中增長值
res = db.table1.find_one({"name": "changhao_update"})
res['age'] = 20
# 將值更新到記錄中
res = db.table1.update_one({"name": "changhao_update"}, {"$set": res})
print(res.modified_count)

刪除語句

刪除單條

# 刪除結果中的一條
res = db.table1.delete_one({"name": "changhao_update"})
print(res.deleted_count)

刪除多條

# 刪除多條, 正則匹配的數據
query = {"name": {"$regex": "^c"}}
res = db.table1.delete_many(query)
print(res.deleted_count)

# 刪除全部
del_res = db.table1.delete_many({})
相關文章
相關標籤/搜索