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 非常突出的特点。
需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意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})
|
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() { 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 := 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) } }
|