什么是MongoDB

MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。MongoDB用c++编写的。

优势:
  • 面向文档的存储:以 JSON 格式的文档保存数据。

  • 任何属性都可以建立索引。

  • 复制以及高可扩展性。

  • 自动分片。

  • 丰富的查询功能。

  • 快速的即时更新。

  • 来自 MongoDB 的专业支持。

mongodb安装与启动

mongodb下载网址: https://www.mongodb.com/download-center/community

选择版本、系统环境、包 。以下将以tgz包 为例

下载完成将得到mongodb-linux-x86_64-rhel70-4.2.8.tgz包,将其上传到linux(centos7)某个目录

上传完成后解压

tar zxvf mongodb-linux-x86_64-rhel70-4.2..tgz

移动到/usr/local/mongodb目录(非必须)

mv mongodb-linux-x86_64-rhel70-4.2./ /usr/local/mongodb

创建专门的负责的用户并赋予权限(非必须)

cd /usr/local/mongodb
groupadd mongodb
useradd -s /sbin/nologin -g mongodb -M mongodb
mkdir data log run
chown -R mongodb:mongodb data log run

在/usr/local/mongodb 里面创建一个配置文件 mongodb.conf

vim mongodb.conf 并写入下面的信息:

bind_ip=0.0.0.0
port=
dbpath=/usr/local/mongodb/data/
logpath=/usr/local/mongodb/log/mongodb.log
pidfilepath =/usr/local/mongodb/run/mongodb.pid
logappend=true
fork=true
maxConns=
noauth = true # 配置解释:
# fork=true 运行在后台
# logappend=true 如果为 true,当 mongod/mongos 重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为 false。
# noauth = true 不需要验证用户密码
# maxConns= 最大同时连接数 默认2000

以上是MongoDB的安装与启动的准备工作,可直接启动 启动命令:

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb.conf

配置环境变量

vim /etc/profile 

在/etc/profile文件末尾添加一行:

export PATH=/usr/local/mongodb/bin:$PATH

让其生效:

source /etc/profile

查看当前mongodb的版本:

mongod --version

MongoDB的crud

理解几个概念

集合:对应mysql的table

文档:对应mysql的一条数据

数据库的操作

连接MongoDB,执行mongo命令

mongo

 查看MongoDB自带的原始数据库

show dbs

admin:从权限角度来看,这是“root”数据库。如果将一个用户添加到这个数据库。这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器

local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

config:当mongo用于分片设置时,config数据库在内部使用。用于保存分片的相关信息

创建或进入数据库:use 数据库名

use test

使用use时,如果数据库存在则会进入到相应的数据库,如果不存在则会自动创建  一旦进入数据库,则可以使用db来引用当前库 ;

如果是第一次创建,那个这个数据库只是存在于内存当中,直到这个数据库中创建了集合后才会持久化到磁盘上

 

删除数据库:db.dropDatabase()

db.dropDatabase()

集合的操作

用于删除已经持久化的数据库,刚创建在内存中的数据库删除无效

相当于恢复到刚创建test数据库且并没有持久化到磁盘的状态

创建一个集合:db.createCollection("集合名称")

db.createCollection("西游记")

查看所有的集合show tables 或者 show collections

show tables
show collections

删除集合:db.集合名称.drop()

db.西游记.drop()

文档的操作

添加一条数据

db.xyj.insert({name:"猪八戒",age:,gender:"男"})

这里会自动创建xyj这个集合

查询数据

db.xyj.find()

可以看到,我们没有指定id,MongoDB自动给我们生成了一条id,我们也可以指定id,如下

添加一条指定id的数据

db.xyj.insertOne({_id:"workd",name:"猪八戒",age:,gender:"男"})

当我们向集合中插入文档时,如果没有给文档指定 _id属性,则数据库会自动为文档添加 _id该属性用来作为文档的唯一标识 _id

我们可以自己指定,如果我们指定了数据库就不会在添加了,如果自己指定 _id 也必须确保它的唯一性

批量添加数据

db.xyj.insert([
... {name:"沙和尚",age:,gender:"男"},
... {name:"白骨精",age:,gender:"女"},
... {name:"蜘蛛精",age:,gender:"女"}
... ])

或者以下命令也是一样的效果

db.xyj.insertMany([
{name:"沙和尚",age:,gender:"男"},
{name:"白骨精",age:,gender:"女"},
{name:"蜘蛛精",age:,gender:"女"}
])

 总结:

  db.collection.insertOne() 插入一个文档对象
  db.collection.insertMany() 插入多个文档对象

额外小知识

try{
db.xyj.insert([
{name:"沙和尚",age:,gender:"男"},
{name:"白骨精",age:,gender:"女"},
{name:"蜘蛛精",age:,gender:"女"}
]);
}catch(e){
print(e)
}

可以知道那条插入失败

全量修改操作

db.xyj.update({_id: ObjectId("5f0189a368c6a000f725c87b")},{age:NumberInt()})

执行效果:这条数据只有age一个字段了

局部修改操作

db.xyj.update({_id:ObjectId("5f0189a368c6a000f725c87c")},{$set:{age:NumberInt()}})

执行效果:只会修改这条数据的某个字段

批量修改

db.xyj.update({name:"蜘蛛精"},{$set:{age:NumberInt()}},{multi:true})

 注意:在修改条数据时,必须要加上第三个参数{multi:true},否则只会修改一条数据

字段增加操作

db.xyj.update({_id:"workd"},{$inc:{age:NumberInt()}})

注意:$inc对应的字段必须是数字,而且递增或递减的值也必须是数字。

删除文档

db.xyj.remove({_id:"workd"})

删除文档字段

db.xyj.update({"_id": ObjectId("5f0189a368c6a000f725c87d")}, {"$unset": {"name":}})

$unset指定字段的值只需是任意合法值即可

删除所有

db.xyj.remove({})  

数组操作

插入测试数据

db.xyj.insertMany([
{name:"沙和尚",age:,gender:"男",hobby:["打篮球","吃喝"]},
{name:"白骨精",age:,gender:"女",hobby:["吃喝"]},
{name:"蜘蛛精",age:,gender:"女",hobby:["跑步","打乒乓球"]},
{name:"唐生",age:,gender:"男",hobby:["坐禅","吃喝"]}
]);

添加数组内容($push)

db.xyj.update({"name": "白骨精"}, {"$push": {"hobby": "念佛"}})

 删除元素($pop

删除最后一个元素

db.xyj.update({"_id": ObjectId("5f019375caf12a975c177d10")}, {"$pop": {"hobby": }})

删除第一个元素

db.xyj.update({"_id": ObjectId("5f019375caf12a975c177d13")}, {"$pop": {"hobby": -}})

 

删除特定元素($pull

db.xyj.update({"_id": ObjectId("5f019375caf12a975c177d11")}, {"$pull": {"hobby": "念佛" }})

添加一条测试数据

db.xyj.insert({name:"猪八戒",age:,gender:"男",address: [{place: "nanji", tel: }, {place: "dongbei", tel: }]});

更新嵌套数组的值($set)

db.xyj.update({"_id": ObjectId("5f019881caf12a975c177d14")}, {"$set": {"address.0.tel": }})

 数组查询:

db.xyj.find({"hobby":"跑步"})

多个元素的查询

db.xyj.find({"hobby":{"$all": ["跑步", "打乒乓球"]}})

只有hobby数组同时存在跑步和打乒乓球才会匹配

限制数组长度查询

db.xyj.find({"hobby": {"$size": 1}})

只有数组的长度是1才会匹配

投影查询

db.xyj.find({name:"白骨精"},{name:,_id:})

1表示显示 0表示强制隐藏

相当于sql里面只查某些字段

按字段条件查询

db.xyj.find({name:"白骨精"})

按字段条件查询并只返回一条

db.xyj.findOne({gender:"女"})

其他api就不都演示了

组合查询:

语法:db.xyj.find($and:[{},{},{}])
//查询年级大于20小于50的
db.xyj.find({$and:[{age:{$gt:NumberInt()}},{age:{$lt:NumberInt()}}]})
//查询名字里有”精“的或者年纪大于30的
db.xyj.find({$or:[{age:{$gt:NumberInt()}},{name:/精/}]})

比较查询:

db.xyj.find({age:{$gt:NumberInt()}})  //查询年级大于20岁的

$gt--》大于     $lt--》小于   $gte--》大于等于     $lte--》小于等于   $ne---》不等于(不等于不一定要用于数字)

包含查询:

 db.xyj.find({age:{$in:[,]}})

不包含:

 db.xyj.find({age:{$nin:[,]}})

Like:

db.xyj.find({"name": /精/})

统计查询:

db.xyj.count()或者db.xyj.count({字段:条件})

取模:

db.xyj.find({"age": {$mod: [, ]}})
比如我们要匹配 age % ==

是否存在($exists)

db.xyj.find({"love": {"$exists": true}})  // 如果存在字段love,就返回
db.xyj.find({"love": {"$exists": false}}) // 如果不存在字段love,就返回

分页查询

limit:显示几条记录

skip:跳过几条记录

第一次查询:db.xyj.find().limit(2)

第一次查询:db.xyj.find().limit(2).skip(2)

结合排序:db.xyj.find().limit(2).skip(2).sort({age:1}) // 1代表升序,-1代表降序

执行顺序: sort > skip > limit

聚合管道

较常见的管道操作符以及他们的作用:

操作符 描述 语法
$project 数据投影,主要用于重命名,增加,删除字段 db.article.aggregate({ $project : {title : 1 ,author : 1 ,}});
$match 过滤,筛选符合条件的文档,作为下一阶段输入 db.articles.aggregate( [{ $match : { score : { $gt : 70, $lte : 90 } } },{ $group: { _id: null, count: { $sum: 1 } } }] );
$limit 限制经过管道的文档数量 db.article.aggregate({ $limit : 5 });
$skip 待操作集合处理前跳过部分文档 db.article.aggregate({ $skip : 5 });
$unwind 将数组拆分成独立字段 db.article.aggregate({$project:{author:1,title:1,tags:1}},{$unwind:"$tags"})
$group 对数据进行分组 db.article.aggregate({ $group : {_id : "$author",docsPerAuthor : { $sum : 1 },viewsPerAuthor : { $sum : "$pageViews" }}});
$sort 对文档按照指定字段排序 db.users.aggregate( { $sort : { age : -1, posts: 1 } });
$sample 随机选择从其输入指定数量的文档。 { $sample: { size: <positive integer> } }
$out 必须为pipeline最后一个阶段管道,因为是将最后计算结果写入到指定的collection中  
$indexStats 返回数据集合的每个索引的使用情况 { $indexStats: { } }

插入测试数据

document1=({name:'dogOne',age:,tags:['animal','dog'],type:'dog',money:[{min:},{norm:},{big:}]});

document2=({name:'catOne',age:,tags:['animal','cat'],type:'cat',money:[{min:},{norm:},{big:}]});

document3=({name:'catTwo',age:,tags:['animal','cat'],type:'cat',money:[{min:},{norm:},{big:}]});

document4=({name:'dogTwo',age:,tags:['animal','dog'],type:'dog',money:[{min:},{norm:},{big:}]});

document5=({name:'appleOne',age:,tags:['fruit','apple'],type:'apple',money:[{min:},{norm:},{big:}]});

document6=({name:'appleTwo',age:,tags:['fruit','apple'],type:'apple',money:[{min:},{norm:},{big:}]});

document7=({name:'pineapple',age:,tags:['fruit','pineapple'],type:'pineapple',money:[{min:},{norm:},{big:}]});

db.mycol.insert(document1)

db.mycol.insert(document2)

db.mycol.insert(document3)

db.mycol.insert(document4)

db.mycol.insert(document5)

db.mycol.insert(document6)

db.mycol.insert(document7)

假定我们想提取money中min为100的文档,并且只输出名称和money数组中的min那一项

db.mycol.aggregate(
{$match:{'money.min':}},
{$project:{_id:,name:'$name',minprice:'$money.min'}}
)

假定我们想提取money中min小于100的文档,并且限制3个文档,跳过一个文档再显示

通过type类型来对数据进行分类,并且同时统计他们的年龄age总和

db.mycol.aggregate(
{$group:{_id:'$type',sumage:{$sum:'$age'}}}
)

按照年龄对数据进行排序

db.mycol.aggregate(
{$group:{_id:'$type',sumage:{$sum:'$age'}}},
{$sort:{sumage:}}
)

MongoDB安装和入门的更多相关文章

  1. MongoDB安装及入门

    下载 windows下的是3.2的版本 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ mongodb采用27 ...

  2. 二、NodeJS入门——准备工作(2)——MongoDB安装以及客户端Robomongo安装和使用

    目录     1.介绍     2.下载地址     3.MongoDB安装过程     4.MongoDB的使用     5.MongoDB添加管理员账户     6.RoboMongo安装过程   ...

  3. MongoDB一:入门(安装与配置)

    一.简介 MongoDB  是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB MongoDB 是一个介于关系数据库和非关系数据库 ...

  4. MongoDb安装和快速入门

    1.Mongodb安装 2.mongodb的增删改查 3.MongoDB数据类型 4.Mongodb $关键字 $修改器 5.MongoDB 之 "$" 的奇妙用法 6.Mongo ...

  5. MongoDB+MongoVUE安装及入门

    前言及概念 据说nodejs和mongoDB是一对好基友,于是就忍不住去学习了解了一下MongoDB相关的一些东西, 那么,MongoDB是什么?这里的五件事是每个开放人员应该知道的: MongoDB ...

  6. MongoDB学习——基础入门

    MongoDB--基础入门 MongoDB是目前比较流行的一种非关系型数据库(NoSql),他的优势这里不废话,我们关注怎么使用它. 安装 下载,首先肯定要去下载,我们去官网下载,在国内,可能没FQ可 ...

  7. windows下nodejs express安装及入门网站,视频资料,开源项目介绍

    windows下nodejs express安装及入门网站,视频资料,开源项目介绍,pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步:下载安装文件下载地址: ...

  8. MongoDB 安装详细教程 + 常用命令 + 与 Python 的交互

    MongoDB 简介 MongoDB (名称来自 humongous/巨大无比的, 是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于 分布式 文件存储,由 C++ 语言编写,设计之初旨 ...

  9. Mongodb最基础入门教程

      Mongodb最基础入门教程 如果想了解一下redis的入门教程,可以去看一下我的上一篇博客 Mongodb的安装大家可以参考一下其他博主的博客,这里我就不做介绍了.不过值得注意的是,在Linux ...

随机推荐

  1. Java 实现 蓝桥杯 历届试题 分糖果

    问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数 ...

  2. 分布式ID总结

    分布式ID 生成的ID使用场景 几乎所有的业务系统,都有生成一个记录标识的需求,例如:message_id, order_id.这个记录标识往往就是数据库中的唯一主键,数据库上会建立聚集索引(clus ...

  3. zabbix3.2升级3.4报错Database error

    摘要: zabbix3.2版本升级到zabbix3.4版本后打开页面报错,报错内容如下 Database errorThe frontend does not match Zabbix databas ...

  4. k8s学习-安全

    4.8.安全 4.8.1.概念 一些内容可参考4.6.2.Secret的内容 说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群 ...

  5. Java实现圆柱体表面积和体积的计算

    题目描述: Java编程实现圆柱体表面积和体积的计算,要求从键盘上输入圆的半径和高,然后输出结果. 题目分析: 首先定义Circle类,然后在main方法中创建Circle类的对象c,利用对象c访问其 ...

  6. .NET 技术栈 思维导图

    背景介绍 根据网上招聘网站的一些.NET技能需求,画了一个图,便于在自修和学习的过程当中有一个方向. 技能栈 Web front-end o 框架技术 ▣ Vue ▣ Bootstrap ▣ LayU ...

  7. EIGRP-9-弥散更新算法-拓扑表

    弥散更新算法(DUAL)是一个收敛算法.它代替了其他距离矢量协议使用的Bellman-Ford 算法.路由环路.甚至是在协议完全收敛前出现的瞬时环路.都会对网络性能造成不良影响.为了防止环路的形成.D ...

  8. Spring Boot 把 Maven 干掉了,拥抱 Gradle!

    在国外某社交网站上有一个关于迁移 Spring Boot 迁移 Maven 至 Gradle 的帖子: 该贴子上也有很多人质疑:Maven 用的好好的,为什么要迁移至 Gradle? 虽然该贴子只是说 ...

  9. 阿里云Ubuntu配置jdk+tomcat

    阿里云系统环境:Ubuntu 18.04 64位 ssh远程连接工具:Xshell6(如何连接此处不讨论) 一>java jdk安装及环境配置 ​ 1.更新apt-get命令 apt-get - ...

  10. Spring Boot入门系列(十五)Spring Boot 开发环境热部署

    在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...