MongoDB笔记z

213 阅读5分钟

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>)

同时使用gte和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