Mongodb初级教程

背景

mongodb是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

这里简单的讲一下使用方法,不涉及底层理论

起步

Mac下安装MongoDB

之前是 brew install mongodb

但是现在会报错:No available formula with the name “mongodb”。

先tap一个仓库 brew tap mongodb/brew 安装mongodb社区版 brew install mongodb-community

运行mongod

新建一个/data/db文件夹

运行MongoDB服务 sudo mongod

(注:macOS 10.15 Catalina无法在根目录下进行修改,可以在其他目录新建,启动服务时通过sudo mongod --dbpath=new_path/data/db指定)

定位和启动MongoDB命令行 cd /usr/local/Cellar/mongodb/4.0.3_1/bin ./mongo

MongoDB和关系型数据库(Oracle、MySQL等)的区别:

SQL MongoDB
table collection(集合)
row document(文档)
colume field(数据字段)

每个文档是一组键值对(BSON)相同的字段不需要相同的数据类型

基本命令

show dbs 展示所有数据库

use xx 使用某个数据库

使用了某个数据库后:show collections查看所有的集合

db.dropDatabase() 删除当前数据库

db.<col>.drop() 删除某个集合

mongodump -o <output_path> 导出数据库 (如果设置了密码,需要通过下面的命令导出) sudo mongodump -o <output_path> --authenticationDatabase admin --username <db_username> --password <db_password>

mongorestore -d <dbname> <db_path> 导入数据库

验证

本地的还好,如果部署到服务器上,默认是无法外网访问数据库的,倘若你想访问,就得开放端口然后在mongo的配置文件里设置0.0.0.0。然后mongo默认也没有密码

这就会产生一个很蛋疼的事,当其他人访问你服务器的ip的27017端口时,可以直接完全操作你的数据库,对于非个人弄着玩的项目,这显然是不可能接受的。

所以我们需要增加数据库验证,这里最常见的就是增加账号密码登录,方法如下:

1
2
3
4
// 先使用admin
use admin
// 创建root密码
db.createUser({user: "root",pwd: "password",roles: [ "root" ]})

其他的role:

read
readWrite
dbAdmin
userAdmin
clusterAdmin
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
1
2
3
4
5
6
7
// 创建用户
db.createUser(
{
  user: "username",
  pwd: "password",
  roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]
})

/etc/mongo.conf配置文件里,把auth=true前面的#去掉,让验证生效。

重启mongodb服务sudo service mongodb restart

之后的连接方式:mongo命令行连接: mongo admin -u username -p password

本地GUI(如navicat)连接,设置账号密码即可

字段操作

字段重命名:

db.col.update({},{$rename:{"old_field":"new_field"}},false,true)

比如:

db.questionnaire.update({},{$rename:{"questionList":"question"}},false,true)

字段增加: 还可以指定默认值xxx

db.col.update({},{$set:{new_field:'xxx'}},{multi:true})

字段删除:

db.col.update({},{$unset:{'old_field':''}},false, true)
db.user_questionnaire.update({},{$unset:{'inputCostEstimation':''}},false, true)

查找

列出集合信息:

db.<collection-name>.find()

列出第一条集合的信息(按Json排版一下):

db.<collection-name>.findOne()
db.<col-name>.find({query}, {show})

query是一个查询字段。比如{"name":"yicheng"}这种形式 后面的参数决定field是否显示,比find({"name":"yicheng"}, {"_id": 0, "age": 1}) 表示_id不会显示,age会显示

条件比较:

操作 描述 用法
$gt >
$gte >=
$lt <
$lte <=
$eq =
$ne !=
$in in
$nin not in

增删改

增加:

db.col.insert(json)

e.g.

db.col.insert({"name":"engine", "age":18})

db.articles.insert({"title":"Test","author":"engine","time":"2020.02.27","kind":"tech","tags":"golang,website","content":"This is a blog for test","comment":"comment1","view":10,"like":5})

db.user.insert({"name":"user1",avatar:"https://i.loli.net/2020/03/15/XsJjRomr1dy8u4D.png","type":0,"score":20,"password":"123456","todo":""})

删除:

db.col.remove(query)

修改

db.mycoll.update(query, object[, upsert_bool, multi_bool])

第一个参数是查询条件,第二个参数是修改信息,第三个是如果没找到是否相当于插入(默认为false),第四个参数是修改一个还是所有(默认为false)

e.g.

db.col.update({"name":"engine"}, {$set:{"age":20}})

db.col.update({"age": {$gt: 20}}, {$set:{"age": 30}}, false, true)

更复杂的逻辑:

db.getCollection('participant').find().forEach(
   function(item){
       db.getCollection('participant').update({"_id":item._id},{$set:{"modifyTimes": 3}})
   }
)
数据类型 描述
String字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean布尔值。用于存储布尔值(真/假)。
Double双精度浮点值。用于存储浮点值。
Min/Max keys将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array用于将数组或列表或多个值存储为一个键。
Timestamp时间戳。记录文档修改或添加的具体时间。
Object用于内嵌文档。
Null用于创建空值。
Symbol符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID对象 ID。用于创建文档的 ID。
Binary Data二进制数据。用于存储二进制数据。
Code代码类型。用于在文档中存储 JavaScript 代码。
Regular expression正则表达式类型。用于存储正则表达式。

更新某个字段的值

1
2
3
4
5
db.getCollection('participant').find().forEach(
   function(item){
       db.getCollection('participant').update({"_id":item._id},{$set:{"modifiTimes": 2}})
   }
)

Golang的MongoDB接口:mgo

简单的使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type Person struct {
	Name  string
	Phone string
}
func main() {
        // mgo.Dial核心函数,由url新建一个session
	session, err := mgo.Dial("mongodb://127.0.0.1:27017/")
	if err != nil {
		panic(err)
	}
	defer session.Close()
	// Optional. Switch the session to a monotonic behavior.
	session.SetMode(mgo.Monotonic, true)
        // c就连到了对应的collection
	c := session.DB("test").C("people")
        // 插入数据
	err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
		&Person{"Cla", "+55 53 8402 8510"})
	if err != nil {
		log.Fatal(err)
	}
	result := Person{}
        // result是一个查询结果
	err = c.Find(bson.M{"name": "Ale"}).One(&result)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Phone:", result.Phone)
}