mongo 基础知识
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
一、基础操作
创建数据库 use xx
use uat
如果数据库不存在,则创建数据库,否则切换到指定数据库。
查看所有数据库show dbs
show dbs
>admin 0.000GB
config 0.000GB
local 0.000GB
我们刚创建的数据库 uat并不在数据库的列表中, 要显示它,我们需要向 uat数据库插入一些数据。
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
创建集合createCollection
db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段 | 类型 | 描述 |
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
例如:
我们创建一个集合空间大小1 KB, 文档最大个数为 1 个。
db.createCollection("student", { capped : true, size :
1, max : 1 } )
db.student.insert({"age":133,"name":"1"})
当我们多次执行插入的时候发现数据 被覆盖。只有一条。
查看集合
show collections或show tables
1、插入操作
insert()插入一个或多个对象
db.collection.insert(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
参数说明:
- document:要写入的文档,单个或多个都可以。
- writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。请按顺序在数组中插入文档,并且如果其中一个文档发生错误,则MongoDB将返回而不处理数组中的其余文档。如果为
false
,请执行无序插入,并且如果其中一个文档发生错误,请继续处理数组中的其余文档。 - 如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
举例1:新增一个user对象,并赋予name,age,school,hobby字段
db.user.insert({"name":"小欢","age":12,"school":"一中","hobby":["数学","唱歌","跳舞"]})
结果如下:
{
"_id": ObjectId("5ff570f36d6f000064006096"),
"name": "小欢",
"age": 12, // 显示12.0 不同的工具展示的不同
"school": "一中",
"hobby": [
"数学",
"唱歌",
"跳舞"
]
}
我们会发现会多一个_id
字段,这是自动生成的,官网中这样写道:
如果文档未指定_id字段,则MongoDB将添加该_id
字段并ObjectId为文档分配唯一的位置 ,然后再进行插入。大多数驱动程序会创建一个ObjectId并插入_id
字段,但是 如果驱动程序或应用程序未创建,则会创建并填充_id
。
如果文档包含一个_id
字段,则该_id
值在集合中必须唯一,以避免重复的键错误。
所以我们自己指定这个值也是可以的,如果同一个_id 插入多次会报 “duplicate key error collection”
db.user.insert({
"_id": 002,
"name": "小黄",
"age": 18,
"school": "一中",
"hobby": ["跳舞"],
"study": {
"yuwen": 98,
"shuxu": 99,
"english": 100
}
})
举例2:插入两个学生对象
db.user.insert([{"name":"小红","age":21,"school":"一中","hobby":["排球","唱歌","魔方"]},{"name":"小白","age":18,"school":"三中","hobby":["英语","唱歌","跳舞"]}])
insertOne()插入一条
3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。
- 要插入单个文档,请使用db.collection.insertOne。
- 要插入多个文档,请使用 db.collection.insertMany。
对应上面分别是:
//insertOne()
db.user.insertOne({
"name": "小红",
"age": 21,
"school": "一中",
"hobby": ["排球", "唱歌", "魔方"],
"study": {
"yuwen": 98,
"shuxu": 99,
"english": 100
}
})
//insertMany()
db.user.insertMany([{
"name": "小红",
"age": 21,
"school": "一中",
"hobby": ["排球", "唱歌", "魔方"],
"study": {
"yuwen": 98,
"shuxu": 99,
"english": 100
}
}, {
"name": "小白",
"age": 18,
"school": "三中",
"hobby": ["英语", "唱歌", "跳舞"],
"study": {
"yuwen": 98,
"shuxu": 99,
"english": 100
}
}])
2、查看操作
查看基础操作
用法如下:
db.collection.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
举例1、查询年龄是18的学生,并且是“一中”的学生,并且 yuwen=98
db.getCollection('user').find({"age":21,"school":"一中","study.yuwen":98})
// where age=18 and school="一中"
举例2、查询年龄是18的学生,并且只返回name字段
1返回 0 不返回
db.getCollection('user').find({"age":18,"school":"一中"},{"name":1})
// 1返回 0 不返回 默认也返回_id 字段,如果不想返回改字段,正确的是下面的这样
db.getCollection('user').find({"age":18,"school":"一中"},{"name":1,"_id":0})
举例3、查询年龄18的学生,并按照_id 降序 排序 ,name升序排序 。
sort() 1 是升序,-1 是降序
db.getCollection('user').find({"age":18}).sort({"_id": -1,"name":1})
// 1 是升序,-1 是降序
举例4、查询全部
db.getCollection('user').find({})
举例5、查询前2条数据 [limit()]
db.getCollection('user').find({}).limit(2)
举例6,查询第3、第4条数据[skip()]
db.getCollection('user').find({}).skip(2).limit(2)
大小比较操作符
db.collection.find({ "field" : { value } } ); // 等于: field = value
db.collection.find({ "field" : { $gt: value } } ); // 大于: field > value
db.collection.find({ "field" : { $lt: value } } ); // 小于: field < value
db.collection.find({ "field" : { $gte: value } } ); // 大于等于: field >= value
db.collection.find({ "field" : { $lte: value } } ); // 小于等于: field <= value
db.collection.find({ "field" : { $ne: value } } ); // 不等于: field != value
如果要同时满足多个条件,可以这样做
db.collectionName.find({ "field" : { $gt: value1, $lt: value2 } } ); // value1 < field < value2
举例:
1、请查询age大于19并且小于45的记录。
db.getCollection('user').find({ age : { $gt: 19, $lt: 45} });
关系操作符 ("$or", "$in","$nin" )
1、查询年龄 18并且是一中的
db.getCollection('user').find({"age":18,"school":"一中"})
2、查询年龄是18或者是一中的($or)
db.getCollection('user').find({$or:[{"age":18},{"school":"一中"}]})
//where age=18 or school ="一中"
3、查询年龄是15,18,19的($in)
db.getCollection('user').find({"age":{$in:[15,18,19]}})
4、查询年龄不是15的($nin)
db.getCollection('user').find({"age":{$nin:[15]}})
$size
1、查询hobby 是3个的
db.getCollection('user').find({"hobby":{$size:3}})
3、修改操作
update() 方法用于更新已存在的文档。语法格式如下:
- 更新操作: db.collection.update(query, update, options)
- 更新单个文档:db.collection.updateOne(filter, update, options)
- 更新多个文档:db.collection.updateMany(filter, update, options)
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
举例:
db.person.insert([{
"student_no":"10003",
"name": "小黄花0",
"age": 11,
"school": "一小",
"sex": "男",
"project": [
{
"name": "数学",
"score": 122
},
{
"name": "语文",
"score": 99
},
{
"name": "英语",
"score": 109
},
{
"name": "科学",
"score": 76
}
],
"hobby": [
"吉他",
"跳绳",
"编程"
]
},{
"student_no":"10003",
"name": "小黄花0",
"age": 11,
"school": "一小",
"sex": "男",
"project": [
{
"name": "数学",
"score": 122
},
{
"name": "语文",
"score": 99
},
{
"name": "英语",
"score": 109
},
{
"name": "科学",
"score": 76
}
],
"hobby": [
"吉他",
"跳绳",
"编程"
]
}])
修改举例:
//默认更新第一条
db.person.update({"student_no": "10003"},{$set:{ "age": 10,"name": "小黄花10"}});
//匹配到多条,更新多条
db.person.updateMany({"student_no": "10003"},{$set:{ "age": 14,"name": "小黄花14"}});等价于
db.person.update({"student_no": "10003"},{$set:{ "age": 17,"name": "小黄花17"}},true,true);
//更新一条
db.person.updateOne({"student_no": "10003"},{$set:{ "age": 15,"name": "小黄花15"}});等价于
db.person.update({"student_no": "10003"},{$set:{ "age": 18,"name": "小黄花18"}},true,flase);
4、删除操作
- 删除 文档:db.collection.remove()
- 删除单个文档 :db.collection.deleteOne()
- 删除多个文档 :db.collection.deleteMany()
deleteOne()方法
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>,
hint: <document|string> // Available starting in MongoDB 4.4
}
)
参数说明:
- filter: 使用查询运算符指定删除条件。指定一个空文档以删除集合中返回的第一个文档。
- writeConcern :可选,抛出异常的级别。
- collation: 可选,
- hint: 可选
返回值:
包含以下内容的文档:
一个布尔值acknowledged,true:带有 写关注点,false:禁用了写关注点
deletedCount 包含已删除文件的数量
deleteMany()方法
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
举例
//删除所有匹配到的
db.person.remove({"student_no": "10003"});
//删除匹配到的第一条
db.person.deleteOne({"student_no": "10003"});//删除匹配到的所有
db.person.deleteMany({"student_no": "10003"});