MongoDB定义
- MongoDB是一个基于分布式文件存储的开源数据库
- MongoDB将数据存储为一个文档,数据结构有键值对组成,文档类似于JSON对象,字段值可以包含其他文档,数组和文档数组
MongoDB安装
mac安装
brew install mongodb
云安装
1、 下载mongodb
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.9.tgz
2、 解压
tar zxvf mongodb-linux-x86_64-3.2.9.tgz
将解压过后的包移动到指定目录
mv mongodb-linux-x86_64-3.2.9/ /usr/local/mongodb
3、创建数据文件夹和日志文件夹等
mkdir -p /usr/local/mongodb/data
touch /usr/local/mongodb/mongod.log
touch /usr/local/mongodb/mongodb.conf
4、启动方式
进入Mongo的bin目录下:
cd /usr/local/mongodb/bin
1、通过参数启动
./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/mongod.log --logappend --port=27017 --fork ###权限不足的话加上sudo
2、通过配置文件启动, 首先进行配置
vim /usr/local/mongodb/mongodb.conf ###权限不足的话加上sudo
在配置中加入
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/mongod.log
logappend = true
port = 27017
fork = true
auth = true
###:wq 保存退出
进入mongo的bin目录下
cd /usr/local/mongodb/bin
./mongod --config /usr/local/mongodb/mongodb.conf
停止
./mongod -shutdown -dbpath=/usr/local/mongodb/data
配置安全组
最后放开端口
/sbin/iptables -I INPUT -p tcp --dport 27017 -j ACCEPT
MongoDB的基本概念
- 数据库 MongoDB的单个实例可以容纳多个独立的数据库,比如一个学生管理系统就可以对应一个数据库实例
- 集合 数据库是由集合组成的,一个集合用来表示一个实体,如学生集合
- 文档 集合是由文档组成的,一个文档表示一条记录,比如一位同学张三就是一个文档
数据库操作
使用数据库
use database_name
查看所有的数据库
show dbs
db.students.insert({name:'jinxin',age:1});
查看当前的数据库
db
删除数据库
db.dropDatabase()
集合操作
查看集合帮助
db.collection_name.help();
查看数据库下的集合
show collections
创建集合
创建一个空集合
db.createCollection(collection_name)
创建集合并插入一个文档
db.collection_name.insert(document)
插入文档
insert
## 范例
db.collection_name.insert(document);
## 实例
# 每当插入一条新文档的时候mongodb会自动为此文档生成一个_id属性,_id一定是唯一的,用来唯一标识一个文档 _id也可以直接指定,但如果数据库中此集合下已经有此_id的话插入会失败
db.students.insert({_id:1,name:'jinxin',age:1});
WriteResult({ "nInserted" : 1 })
db.students.insert({_id:1,name:'jinxin',age:1});
save
db.collection_name.save(document)
# 注:如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
> db.students.save({_id:1,name:'jinxin',age:1});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.students.save({_id:1,name:'jinxin',age:100});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更新文档
语法
db.collection_name.update(
<query>,
<updateObj>,
{
upsert: <boolean>,
multi: <boolean>
}
)
参数
- query 查询条件,指定要更新符合哪些条件的文档
- update 更新后的对象或指定一些更新的操作符
- $set直接指定更新后的值
- $inc在原基础上累加
- upsert 可选,这个参数的意思是,如果不存在符合条件的记录时是否插入updateObj. 默认是false,不插入。
- multi 可选,mongodb 默认只更新找到的第一条记录,如果这个参数为true,就更新所有符合条件的记录。
upsert
将students集合中数据中name是test1的值改成test2
> db.students.insert({_id:1,name:'jinxin1'});
WriteResult({ "nInserted" : 1 })
> db.students.update({_id:2},{name:'jinxin2'},{upsert:true});
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
muti
更新多条数据
db.students.update({name:'jinxin2'},{$set:{age:10}},{multi:true});
更新操作符
$set
直接指定更新后的值
db.c3.update({name:'jinxin1'},{$set:{age:1}, muti:true});
$inc
在原有的基础上累加
db.c3.update({name:'jinxin1'},{$inc:{age:1}})
$unset
删除指定的键
db.c3.update({name:'jinxin1'},{$unset:{age: 1}}, {muti: true})
$push
向数组中添加元素
var result = db.student.update({name:'张三'},{
$push:{"hobbys":"smoking"}
});
$ne
$ne类似于MYSQL的not in 或者not exist
db.students.update({name: jinxin1, hobby:{$ne: 'smoking'}},{$push:{"hobby":"smoking"}})
$addToSet
向集合中添加元素
db.student.update({name:'jinxin'},{$addToSet:{"hobbys":"smoking"}});
$pull
向集合中删除元素
db.student.update({name:'jinxin'},{$pull:{"hobbys":"smoking"}});
$each
把数组中的元素逐个添加到集合中
var hobbys = ["A",'B'];
db.student.update({name:'jinxin'},{$addToSet:{hobbys:{$each:hobbys}}});
$pop
从数组中移除指定索引中对应的元素
db.student.update({name:'jinxin'},{$pop:{hobbys:1}});
修改指定索引中对应的元素
db.c3.update({name:'jinxin'},{$set:{"hobbys.0":"smoking2"}});
文档的删除
<query>,
{
justOne: <boolean>
}
)
- query :(可选)删除的文档的条件。 -justOne : (可选)如果设为 true 或1,则只删除匹配到的多个文档中的第一个
实例
# 删除worker集合里name是jinxin的所有文档数据
> db.students.remove({name:'jinxin'});
WriteResult({ "nRemoved" : 2 })
查询文档
find
db.collection_name.find()
查询指定列
语法
db.collection_name.find({queryWhere},{key:1,key:1})
参数列表
- collection_name 集合的名字
- queryWhere 参阅查询条件操作符
- key 指定要返回的列
- 1 表示要显示
findOne
查询匹配结果的第一条数据语法
db.collection_name.findOne()
$in
查询字段在某个范围内
db.student.find({age: $in:[30,100]},{name:1, age:1})
$nin
查询字段不在某个范围内
db.student.find({age:{$nin:[30,100]}},{name:1,age:1});
$not
对特定条件取反
db.student.find({age:{$not:{$gte:20,$lte:30}}});
array
对数组的查询
// 按所有元素匹配
//let result = db.student.find({friends:[ "A", "B", "C", "D" ]});
//匹配一项 包含A的就可以
//let result = db.student.find({friends:"A"});
//$all 必须同时包含A B
//let result = db.student.find({friends:{$all:['A',"B"]}});
//$in 或者关系 ,包含A或者B
//let result = db.student.find({friends:{$in:['A',"B"]}});
//$size 按数组的长度去匹配
//let result = db.student.find({friends:{$size:4}});
//$slice 只返回数组中的某一部分
//let result = db.student.find({friends:{$size:5}},{name:1,friends:{$slice:2}});
//let result = db.student.find({friends:{$size:5}},{name:1,friends:{$slice:-2}});
$slice:["$array", [startIndex, ] length ] (startIndex可以省略,默认从0开始)
"friends" : [ "A", "B" ] } "friends" : [ "C", "D" ]
db.stu.find({},{friends:{$slice:[0,3]}}); "friends" : [ "A", "B", "C" ]
where
db.student.find({$where:"this.age > 30"},{name: 1, age: 1})
cursor
游标不是查询结果,而是查询的一个返回资源或者接口,通过这个接口逐条读取数据
var result = db.student.find();
//while(result.hasNext()){
// printjson(result.next());
//}
条件操作符
条件操作符用于比较两个表达式并从mongoDB集合中获取数据
大于操作符
db.collection_name.find(<key>:{$gt:<value>)
大于等于操作符
db.collection_name.find(<key>:{$gte:<value>})
小于操作符
db.collection_name.find(<key>:{$lt:<value>})
小于等于操作符
db.collection_name.find(<key>:{$lte:<value>)
同时使用lte
db.collection_name.find({<key>:{$gte:<value>}})
使用_id进行查询
db.collectoin_name.find({"_id" : ObjectId("value")})
查询结果集的条数
db.collectoin_name.find().count()
正则匹配
db.collection.find({key:/value/})
与和或
and
find方法可以传入多个健,每个键以逗号隔开
db.collection_name.find({key1:value1, key2:value2})
or
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
and和or连用
db.collection_name.find(
{
key1:value1,
key2:value2,
$or: [
{key1: value1},
{key2:value2}
]
}
)
分页查询
limit
读取指定数量的数据记录
db.collection_name.find().limit(number)
skip
跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数
db.collection_name.find().skip(number)
skip+limit
通常用这种方式来实现分页功能
db.collection_name.find().skip(skipNum).limit(limitNum)
sort排序
sort()方法可以通过指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列
db.collectoin_name.find().sort({<key>:1})
db.collectoin_name.find().sort({<key>:-1})
执行脚本
var username = 'jinxin';
var password = '123456';
var user = { "username": username, "password": password };
var db = connect('students');//选择users数据库
var result = db.users.insert(user);
print('write ' + result);
var start = Date.now();
var db = connect('students');
for (var i = 0; i < 1000; i++) {
db.users.insert({ "username": "jinxin" + i });
}
var cost = Date.now() - start;
print('cost ' + cost + ' ms');
在命令中执行
script>mongo 1.js
MongoDB shell version: 2.6.7
connecting to: test
connecting to: students
write WriteResult({ "nInserted" : 1 })
权限
创建用户
- 使用user admin进入我们的admin库
- 使用db.createUser方法来创建集合
db.createUser({
user:'jinnxin',
pwd:'123456',
customData:{
name:'jinxin',
email:'jinxin@126.com',
age:9
},
roles:[
{
role:'readWrite',
db:'school'
},
'read'
]
});
查询用户
db.system.users.find();
删除用户
db.system.users.remove({user:'jinxin'});
启动数据库权限检查
mongod --auth
mongo -u jinxin -p 123456 127.0.0.1:27017/admin