mongodb(二)–常用操作
一、简介
这一节将对mongodb中语句的执行进行介绍,包含mongdb的数据类型、语句执行的方式和常用增删改查操作。mongodb自带javascript shell,其是一个javascript解释器,可以运行任何javascript语句。
二、数据类型
2.1 基本数据类型
类型参考官网地址:https://docs.mongodb.com/manual/reference/operator/query/type/index.html
mongodb中常用数据类型有:
数据类型 | 描述 | 示例 |
---|---|---|
null (Null) | 空值 | { “address” : null} |
bool (Boolean) | 布尔型,true或false | { “excellent” : true} |
string (String) | 字符串 | { “stuId” : “002”} |
int (Integer) | 整型,32位或64位,取决于服务器 | { “age” : 18 } |
double | 双精度浮点数 | { “score” : 99.9 } |
date (Date) | 日期 | { “createTime” : ISODate(“2019-07-28T03:32:22.083Z”) } |
timestamp (Timestamp) | 时间戳 | { “updateTime” : 1564318837695 } |
objectId (ObjectId) | _id默认类型(12字节),自动生成,由‘时间+机器+pid+计数器’构成 | { “_id” : ObjectId(“5d3d5a09f7c00d6237da17ce”)} |
Array | 数组 | {“hobby” : [ “football”, “basketball” ] } |
object | 内嵌文档 | |
binary data | 二进制数据 | |
regular expression | 正则表达式 | |
code | 代码 |
三、mongo语句执行方式
mongo语句的执行方式包括在shell中交互式执行、连接时直接执行和执行javascript文件。
3.1 shell中交互式执行
#连接进入shell
mongo mongodb://root:root@localhost:27017/school
#执行语句
db.stu.findOne();
3.2 连接时直接执行
使用–eval, 连接时直接执行javascript语句
mongo mongodb://root:root@localhost:27017/school --eval "db.stu.find().pretty()"
3.3 执行javascript文件
javascript文件写法有两种,一是javascript文件中只写语句,mongodb的连接放在外面;二是mongodb的连接也放在javascript文件中。
另外javascript文件的执行方式也有两种,一是在交互式shell中执行;二是连接时执行。
下面举例说明。
3.3.1 mongodb连接写在外面,javascript语句执行
编写javascript文件mongo_script_1.js
//输出stu集合中一条数据(以json方式)
printjson(db.stu.findOne());
执行mongo_script_1.js文件
#执行javascript文件,添加--quiet可直接输出结果,如:mongo mongodb://root:root@localhost:27017/school -quiet mongo_study.js
mongo mongodb://root:root@localhost:27017/school mongo_script_1.js
3.3.2 mongodb的连接也放在javascript文件中
编写javascript文件mongo_script_2.js
//创建连接
conn = new Mongo('localhost:27017');
//选择数据库
db = conn.getDB('school');
//权限验证
db.auth('root','root');
// 语句执行
printjson(db.stu.findOne());
执行mongo_script_1.js文件
mongo mongo_script_2.js
3.3.3 在交互shell中执行语句
使用load方法,可在交互shell中执行语句,如:
#连接进入shell
mongo mongodb://root:root@localhost:27017/school
#执行语句
load('mongo_script_1.js')
同时load还可用于在一个javascript文件中加载其他javascript文件,如:
//js_util.js文件
function get_date() {
return new Date();
}
//mongo_script_1.js文件
load('js_util.js');
print(get_date());
四、数据库操作
4.1 查看数据库
#查看当前数据库
db;
#查看所有数据库
show dbs;
4.2 选择或新建(没有就新建)数据库
#选择或新建(没有就新建)数据库,如use school;
use db_name;
4.3 删除数据库
#删除数据库
db.dropDatabase;
五、集合操作
5.1 查看集合
#查看集合,也可show tables
show collections
5.2 新建集合
#新建集合,也可不先创建,插入数据时会自动创建,如:db.createCollection('stu')
db.createCollection(collection_name)
5.3 删除集合
#删除集合, 如:db.stu.drop()
db.collection.drop()
六、数据操作
为便于示例,这里创建函数mongo_exe用于执行mongodb语句。
function mongo_exe(){
mongo mongodb://root:root@localhost:27017/school -eval "$1"
}
6.1 查看
6.1.1 普通查询
#查询一条
mongo_exe "db.stu.findOne()"
#查询一条(以格式化方式)
mongo_exe "db.stu.findOne().pretty()"
#查询所有
mongo_exe "db.stu.find()"
#分页查询所有,limit:限制个数 skip:略过个数 sort:排序(1:升序 -1:降序)
mongo_exe "db.stu.find().limit(4).skip(1).sort({'stuId':-1})"
#数组查询, 根据单个数组元素,原始数据为:{ "_id" : ObjectId("5d3d5a09f7c00d6237da17ce"), "stuId" : "011", "score" : 2, "hobby" : [ "sleep", "run", "jump" ] }
mongo_exe "db.stu.find({'hobby':'run'})"
#数组查询,根据多个数组元素满足
mongo_exe "db.stu.find({'hobby':{\$all:['run', 'jump']}})"
#数组查询,根据数组元素个数查询
mongo_exe "db.stu.find({'hobby':{\$size:3}})"
6.1.2 条件查询
常用查询条件有:
$lt:小于;
$lte:小于等于;
$gt:大于;
$gte:大于等与;
$ne:不等于;
$in:包含;
$nin:不包含;
$or:或;
$and:且;
示例如下:
#条件查询,<($lt),<=($lte),>($gt),>=($gte)
mongo_exe "db.stu.find({'age':{\$gt:17}})"
mongo_exe "db.stu.find({'age':{\$lte:18}})"
#不等于查询,$ne
mongo_exe "db.stu.find({'age':{\$ne:18}})"
#条件范围查询,$in, $nin
mongo_exe "db.stu.find({'age':{\$in:[17,18]}})"
#条件范围查询,$or
mongo_exe "db.stu.find({\$or:[{'age':17}, {'age':18}]})"
6.1.3 使用函数查询
使用函数查询速度会比较慢。
#使用函数查询,this指文档
mongo_exe "db.stu.find({'\$where':function(){
if(this.age == 18){
return true;
}
return false;
}})"
#使用函数查询,简写形式
mongo_exe "db.stu.find({'\$where':'this.age==18'})"
6.1.4 个数查询
#个数统计
mongo_exe "db.stu.count({'age':18})"
6.2 插入
#插入
mongo_exe "db.stu.insert({'stuId':'003', 'stuName':'apple3', 'age':18, 'createTime':new Date(),excellent:true, , 'score':99.9, 'address':null, 'updateTime':new Date().getTime(),hobby:['football', 'basketball'], 'teacher':{'schoolName':'No1 middle school'}})"
#批量插入
mongo_exe "db.stu.insert([{'stuId':'010'},{'stuId':'011'},{'stuId':'012'}])"
6.3 更新
6.3.1 普通更新
更新格式为:
db.collection.update(
<query>, #查询条件
<update>, #更新字段
{
upsert:boolean, #选填,true:不存在则插入,默认false
multi:boolean, #选填,true:更新多条记录,默认false(只更新第一条)
writeConsern:<document> #选填,抛出的异常级别
}
示例如下:
#文档替换,没有则忽略
mongo_exe "db.stu.update({'_id':ObjectId('5d3d1cde73917bf1cb6f39fd')},{'stuId':'013', 'age':19})"
#直接文档替换(使用save),_id相同则替换,否则就新建
mongo_exe "db.stu.save({'_id':ObjectId('5d3d1cde73917bf1cb6f39fd'),'stuId':'015','stuName':'apple015'})"
mongo_exe "db.stu.save({'stuId':'016','stuName':'apple016','age':17})"
#指定属性修改($set)
mongo_exe "db.stu.update({'stuId':'011'},{\$set:{'stuName':'apple012'}})"
#数值增减($inc)
mongo_exe "db.stu.update({'stuId':'011'},{\$inc:{'score':1}}, {upsert:true})"
6.3.2 数组更新
#数组修改($push),添加一个值
mongo_exe "db.stu.update({'stuId':'011'},{\$push:{'hobby':'sleep'}}, {upsert:true})"
#数组修改($push, $each),添加多个值
mongo_exe "db.stu.update({'stuId':'011'},{\$push:{'hobby':{'\$each':['run','jump']}}}, {upsert:true})"
#数组修改($addToSet),添加一个值,避免重复插入
mongo_exe "db.stu.update({'stuId':'011'},{\$addToSet:{'hobby':'run'}}, {upsert:true})"
#数组修改($pop),删除指定位置元素,堆栈结构,如1:最后进入的元素 -1:第一个元素
mongo_exe "db.stu.update({'stuId':'011'},{\$pop:{'hobby':1}})"
#数组修改($pull),删除指定元素
mongo_exe "db.stu.update({'stuId':'011'},{\$pull:{'hobby':'jump'}})"
6.3.3 删除
#删除
mongo_exe "db.stu.remove({'stuId':'010'})"
七、结尾
这里列出常用的一些操作,更多操作将在后续介绍。