Cwww3's Blog

Record what you think

0%

MongoDB

MongoDB

简介

MongoDB 是一个面向文档存储的数据库

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

下载地址

1
2
3
# 启动 --dbpath指定数据存放位置
./mongod --dbpath=/path
./mongo 连接MongoDB服务

数据库

1
2
3
4
5
6
7
8
# 显示已有数据库
show dbs
# 切换到指定数据库(没有则创建)
use dbName
# 显示当前所在数据库
db
# 删除当前数据库
db.dropDatabase()

集合

集合就是 MongoDB 文档组。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

1
2
3
4
5
6
7
8
9
10
11
# 列出当前db的集合
show collections;
show tables;
# 创建集合 name集合名 options可选参数(capped大小是否固定 size设置大小,字节数 max指定文档最大数量)
db.createCollection(name, options)
# 例子
db.createCollection("col")
db.createCollection("col", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )

# 删除集合
db.col.drop()

文档

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

需要注意的是:

  1. 文档中的键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 插入文档
db.COLLECTION_NAME.insert(document) # 主键已存在则报错
db.COLLECTION_NAME.insertOne(document) # 主键已存在则更新

# 例子 如果col集合不在该数据库中, MongoDB 会自动创建该集合并插入文档
db.col.insert({title: 'MongoDB',
description: 'MongoDB 是一个 Nosql 数据库',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})

# 查找
db.col.find()
db.col.findOne() # 返回一条
db.col.find().pretty() # 正确可读性

# 更新 将title为MongoDB的文档改为MongoDB 教程 (只会更新一条)
db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB 教程'}})
# 以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true
db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB 教程'},{multi:true}})

# 删除 title为MongoDB 教程的文档
db.col.remove({'title':'MongoDB 教程'})
# 删除一条
db.col.remove({'title':'MongoDB 教程'},1)
# 全删
db.col.remove({})

# 选择指定字段
db.col.find({},{title:1}) # 展示_id,title字段(_id默认展示)
#
db.col.find({},{_id:0,title:1}) # 只展示title字段

# 条件查询
# 等于--{<key>:<value>} 小于--{<key>:{$lt:<value>}} 小于或等于--lte ,大于--gt 大于或等于--gte 不等于--ne
db.col.find({"likes":{$lt:50}}).pretty()
# AND {key1:value1, key2:value2}
db.col.find({"likes":50, "title":"MongoDB 教程"})
# OR
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
# AND + OR
db.col.find({"likes": {$gt:50}, $or: [{"by": "cwww"},{"title": "MongoDB 教程"}]})

# limit
db.col.find().limit(2)

# sort
# 其中 1 为升序排列,而 -1 是用于降序排列
db.col.find().sort({"likes":-1})
  • MongoDB 索引
1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建索引
db.col.createIndex({"title":1})
# 创建复合索引
db.col.createIndex({"title":1,"description":-1})

# 查看集合索引
db.col.getIndexes()
# 查看集合索引大小
db.col.totalIndexSize()
# 删除集合所有索引
db.col.dropIndexes()
# 删除集合指定索引
db.col.dropIndex("title")

登录

mongodb访问默认是用当前访问的库作为验证,若要验证通过可以通过两种方法。

1、在连接串上指定验证库,方法就是在连接串上加上authSource=admin,一般使用admin来做验证库

2、为当前的库添加对应的账户、密码和角色,以满足默认验证库为访问库的情况。

Go操作MongoDB

地址

1
go get go.mongodb.org/mongo-driver/mongo
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package main

import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"log"
"time"
)

func main() {
// 连接MongoDB服务
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
panic(err)
}
err = client.Ping(ctx, readpref.Primary())
if err != nil {
panic(err)
}

// 程序退出前断开连接
defer func() {
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()

// 获取collection对象
collection := client.Database("demo").Collection("col")

// 插入一条文档
res, err := collection.InsertOne(context.Background(), bson.D{{"name", "pi"}, {"value", 3.14159}})
id := res.InsertedID
fmt.Println(id)

// 查询
cur, err := collection.Find(ctx, bson.D{})
if err != nil { log.Fatal(err) }
defer cur.Close(ctx)
for cur.Next(ctx) {
var result bson.D
err := cur.Decode(&result)
if err != nil { log.Fatal(err) }
fmt.Println(result)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
}

Donate comment here.