Mongodb 的操作

NoSQL Mongodb

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

MongoDB是一个介于关系型数据和非关系型数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,其数据结构由键值(key=>value)对组成。

MongoDB 将数据存储为一个文档,MongoDB 文档类似于 JSON 对象。因此可以存储比较复杂的数据类型。

MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库表单查询的绝大部分功能。

安装mangoDB

cd Software/
#解压
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.6.0.tgz 
#配置环境变量
sudo vim ~/.bashrc
#在末尾添加如下内容
export MONGODB_HOME=/home/rock/Software/mongodb-linux-x86_64-ubuntu1604-3.6.0
export PATH=$MONGODB_HOME/bin:$PATH
#刷新环境变量
source ~/.bashrc
#验证环境变量
echo $PATH
 

启动

1、mongod 启动,需要根目录下存在data/db路径,但是通常用户是没有权限去操作根路径中的文件

2、自己创建数据库的存储位置,在我们拥有权限的文件夹中,创建data/db目录结构

3、启动:

mongod --dbpath /home/rock/data/db

4、注意后面存储的是自己的路径

连接

1、mongo 直接连接

安装图形化

tar -zxvf studio-3t-linux-x64.tar.gz

./ studio-3t-linux-x64.sh

基本操作

SQL术语/概念MongoDB术语/概念解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins   表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

MongoDB中常用的几种数据类型:

  • Object ID:文档ID

  • String:字符串,最常用,必须是有效的UTF-8

  • Boolean:存储一个布尔值,true或false

  • Integer:整数可以是32位或64位,这取决于服务器

  • Double:存储浮点值

  • Arrays:数组或列表,多个值存储到一个键

  • Object:用于嵌入式的文档,即一个值为一个文档

  • Null:存储Null值

  • Timestamp:时间戳

  • Date:存储当前日期或时间的UNIX时间格式

数据库操作

> db
test
> use learn
switched to db learn
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db.student.insert({"name":"daisy"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
learn   0.000GB
local   0.000GB
> db
learn
> db.getName()
learn
> db.student.insert({'eat':'土豆'})
WriteResult({ "nInserted" : 1 })
> db.student.find()
{ "_id" : ObjectId("5b188ff933d2607cbb01596b"), "name" : "daisy" }
{ "_id" : ObjectId("5b18907933d2607cbb01596c"), "eat" : "土豆" }
> 
 

创建数据库:

use 数据库名 有的就是切换,没有就是创建

查看当前数据库:

db

db.getName()

查看所有数据库:

show dbs

删除数据库:

db.dropDatebase()

 

集合操作

插入一条数据:

db.student.insert({key:value})

db.student.insertone({key:value})

插入多条数据:

db.student.insertMany([{key:value},{key:value}....])

db.student.insertMany([{'name':'zhangsan','age':24},{'name':'lisi','hobby':'MUSIC'}])

大括号代表document,相当于mysql中的row。document中的key:value,key是field,相当于mysql中的column列。

查询

查询所有:

db.student.find()

条件查询:

db.student.find(query,projection)

query 可选,查询条件

projection 可选,字段过滤,默认返回所有字段

字段为0,为不需要返回

字段为1,为需要返回

投射里 除了_id以外,要么全是1,要么全是0,否则就报错

 
> db.student.find({'name':'lisi'})
{ "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "age" : 18, "hobby" : "sleep" }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "age" : 18, "hobby" : "wangzhe" }
> db.student.find({'name':'lisi'},{'age':1})
{ "_id" : ObjectId("5b1896db33d2607cbb015971") }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
> db.student.find({'name':'lisi'},{'age':0})
{ "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "hobby" : "sleep" }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "hobby" : "wangzhe" }
> 
> db.student.find({'name':'lisi'},{'age':1})
{ "_id" : ObjectId("5b1896db33d2607cbb015971") }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
> db.student.find({'name':'lisi'},{'age':0})
{ "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "hobby" : "sleep" }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "hobby" : "wangzhe" }
> db.student.find({'name':'lisi'},{'age':0,'hobby':1})
Error: error: {
    "ok" : 0,
    "errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
    "code" : 2,
    "codeName" : "BadValue"
}
> db.student.find({'name':'lisi'},{_id:0})
{ "name" : "lisi", "hobby" : "MUSIC" }
{ "name" : "lisi", "age" : 18, "hobby" : "sleep" }
{ "name" : "lisi", "age" : 18, "hobby" : "wangzhe" }
> db.student.find({'name':'lisi'},{'age':1})
{ "_id" : ObjectId("5b1896db33d2607cbb015971") }
{ "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
{ "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
> db.student.find({'name':'lisi'},{'age':1,_id:0})
{  }
{ "age" : 18 }
{ "age" : 18 }
> db.student.find({'name':'lisi'},{'age':0,_id:0})
{ "name" : "lisi", "hobby" : "MUSIC" }
{ "name" : "lisi", "hobby" : "sleep" }
{ "name" : "lisi", "hobby" : "wangzhe" }
> 
 

操作符

常用操作符query的值

等于 {key:value}

小于 {key:{$lt:value}}

小于等于 {key:{$lte:value}}

大于 {key:{$gt:value}}

大于等于 {key:{$gte:value}}

不等于 {key:{$ne:value}}

 
> db.person.find({'age':{$gt:8}})
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
> 
 

模糊查询

查询条件的value值,支持正则表达式,实际上是实现的就是关系型数据库中的like

 
 
 
 
 
> db.person.find({'name':/.*d.*/})
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
 

or 和 and

$or:

db.集合名.find({$or : [{key:value},{key:value}]})

多条件or(或)使用,就是查询中使用$or,$or对应的就是列表,方括号里面query条件

 
 
> db.person.find({'name':'刘帅','age':20})
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
> db.person.find({$or : [{'name':'daisy'},{'age':20}]})
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
> 
 

limit、skip、sort

sort :排序,1代表升序,-1代表降序

 
> db.person.find().sort({'age':1})
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
> db.person.find().sort({'age':-1})
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
> 
 

limit ()

 
> db.person.find().limit(2)
{ "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
 

skip ():跳过结果集的多少条,分页的第二页就是认为跳过第一页的条数

混合写

当同时使用sort、limit、skip的时候,无论位置先后,都是先sort,再skip,最后limit

 
> db.person.find().limit(2).sort({'age':1}).skip(1)
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
> 
 

聚合

 
> db.person.aggregate([{$group:{"_id":null,age_sum:{$sum:"$age"}}}])
{ "_id" : null, "age_sum" : 143 }
 

使用小窍门:key-value ,value只要不是具体的直接的值,就需要冒号之后使用大括号{}

数据删除

1、数据删除

db.集合名字.deleteOne(query) 删除一条数据,第一条匹配到的数据

db.集合名字.deleteMany(query) 删除所有匹配的数据

> db.person.deleteOne({'name':'刘帅'})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.person.find()
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
> db.person.insert({'name':'刘帅','hobby':'吸烟'})
WriteResult({ "nInserted" : 1 })
> db.person.insert({'name':'刘帅','hobby':'喝酒'})
WriteResult({ "nInserted" : 1 })
> db.person.find()
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
{ "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
{ "_id" : ObjectId("5b18a67a33d2607cbb015978"), "name" : "刘帅", "hobby" : "吸烟" }
{ "_id" : ObjectId("5b18a68233d2607cbb015979"), "name" : "刘帅", "hobby" : "喝酒" }
> db.person.deleteMany({'name':'刘帅'})
{ "acknowledged" : true, "deletedCount" : 3 }
> db.person.find()
{ "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
{ "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
> 
 

数据更新

默认只修改第一条文档,如果要修改多条相同的文档,需要设置multi:true

 
 
> db.person.update({'name':'daisy'},{$set:{'age':999}})
> db.person.update({'name':'刘帅'},{$set:{'hobby':'tangtou'}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
 
原文地址:https://www.cnblogs.com/gugubeng/p/9714583.html