MongoDB基础知识总结

Posted by Zxd on June 28, 2018

基本概念

sql monogodb 说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins - 表连接/mongodb不支持
primary key primary key 主键,mongodb自动将_id字段设为主键

创建数据库 use database_name

1
2
3
use database_name
// 如果数据库不存在,则创建数据
// 否则切换到指定数据库

查看所有数据库 show dbs

1
show dbs

删除数据库 db.dropDatabase() (先切换到当前 use doyouSocket)

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

删除集合(表) db.collection.drop()

1
2
3
4
5
6
7
8
9
// 删除了runoob数据库中的集合site
> use runoob
switched to db runoob
> show tables
site
> db.site.drop()
true
> show tables
>

创建集合 db.createCollection(name, options)

1
db.createCollection(name, options)
  • name 要创建的集合名称
  • options 可选参数,如下
字段 类型 描述
capped boolean 如果为true,则创建固定集合(固定大小的集合)当达到最大值时,自动覆盖最早的文档.当capped为true,必须指定size参数
autoIndexId boolean 为true,自动在_id字段创建索引,默认为false
size number 为集合指定一个最大值(以字节计)
max number 指定固定集合中包含文档的最大数量
1
2
3
4
> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
6142800, max : 10000 } )
{ "ok" : 1 }
// 创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个

查看已有的集合 show collections

1
show collections
  • 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合
    1
    2
    3
    4
    > db.mycol2.insert({"name" : "菜鸟教程"})
    > show collections
    mycol2
    // 自动创建了mycol2集合

删除集合 db.collection.drop()

1
db.collection.drop()

文档

插入文档 db.collection_name.insert(document)

1
2
3
4
5
6
7
8
9
10
>db.col.insert({title: 'MongoDB 教程', 
description: 'MongoDB 是一个 Nosql 数据库',
by: 'doyou',
url: 'http://vrfe.top',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
// col是集合名,如果该集合不在数据库中,monogodb会自动创建该集合并插入文档
// 可以用insert()或者save()插入向集合中插入文档.
// 如果不指定_id字段,save()和insert()类似,指定了_id,save则会更新该_id的数据

查看已插入文档 db.col.find()

1
2
db.col.find()
db.col.find().pretty()

更新文档 db.collection.update() / save()

1
2
3
4
5
6
7
8
9
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>, // 可选
multi: <boolean>, // 可选
writeConcern: <document> // 可选
}
)
  • query: update的查询条件 ==> sql update查询where后面
  • update: update的对象和一些更新的操作符 ==> sql update set后面
  • upsert: 可选,如果不存在update记录,是否插入objNew, 默认是false
  • multi: 可选,默认false,只更新找到的第一条记录,如果为true,按条件查出多条全部记录
  • writeConcern: 可选,抛出异常的级别
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
// 在集合col中插入如下数据
>db.col.insert({
title: 'MongoDB',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'doyou',
url: 'http://vrfe.top',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
// 使用update()来更新标题
>db.col.update({'title':'MongoDB'},{$set:{'title':'哟嚯嚯'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息
> db.col.find().pretty()
{
"_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "哟嚯嚯",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "doyou",
"url" : "http://vrfe.top",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
  • 以上只会修改第一条发现的文档,如果要修改多条具有相同条件的文档,设置multi为true
1
>db.col.update({'title':'MongoDB'},{$set:{'title':'哟嚯嚯'}},{multi:true})

删除文档 db.collection.remove()

1
2
3
4
5
6
7
8
9
10
11
12
13
// 2.6版本之后
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)

db.collection_name.remove({'title':'MongoDB'})

// 删除所有数据
db.col.remove({})

查询文档 db.collection.find(query,projection)

1
2
3
db.collection.find(query,projection)
db.collection.find(query,projection).pretty()
db.collection.findOne() 只返回一个文档
  • query: 可选, 指定查询条件
  • projection: 默认省略该参数
1
2
3
4
5
db.col.find({"likes":{$lt:50}}).pretty()	where likes < 50
db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

AND 条件, 每个键值以逗号隔开,即SQL的AND条件

1
>db.col.find({key1:value1, key2:value2}).pretty()

OR条件, 使用关键字$or

1
2
3
4
5
6
7
8
9
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()

db.col.find({$or:[{"by":"doyou"},{"title": "MongoDB"}]}).pretty()

AND 和 OR 联合使用

  • where likes>50 AND (by = 'doyou' OR title = 'MongoDB')
1
db.col.find({"likes": {$gt:50}, $or: [{"by": "doyou"},{"title": "MongoDB"}]}).pretty()

条件操作符

$type操作符

  • 查询集合col中title为String类型的数据
  • 类型映射表
    1
    2
    3
    db.col.find({"title" : {$type : 2}})

    db.col.find({"title" : {$type : 'string'}})

limit()与skip()

  • limit()获取指定数量的数据记录
1
db.collection_name.find().limit(number)
  • skip()跳过指定数量的数据
1
2
db.collection_name.find(query).limit(number).skip(number)
// skip()方法默认参数为0

sort()方法对数据进行排序

1
2
3
4
5
db.collection_name.find().sort({key:1})
// 1 为升序排列
// -1 为降序
db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{'title':1,_id:0}表示要查询title,不查询_id字段,_id默认会查询

createIndex()创建索引

  • 索引参数表
    1
    2
    3
    4
    5
    6
    db.collection.createIndex(keys,options)
    // key值为要创建的索引字段, 1为按升序创建索引 -1位降序
    > db.col.createIndex({"title":1})

    // 复合索引,使用多个字段创建索引
    > db.col.createIndex({"title":1,"description":-1})