MangoDB快速入门

Stella981
• 阅读 627

Author:SimpleWu

MongoDB官方网:https://www.mongodb.com/

MongoDB中文网:http://www.mongodb.org.cn/

什么是MongoDB?

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

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

而MongoDB就不仅仅是SQL。

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

MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB概念

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

MongoDB安装

官方下载网站:https://www.mongodb.com/download-center/community,支持N多平台操作系统。

我们这里下载MongoDB的3.4,windows64位操作系统的解压包,ZIP是绿色版,MSI是安装版。

MangoDB快速入门

安装一路next就成。

MangoDB快速入门

4个文件是协议不需要管,bin目录里面的是可执行文件,但是这个时候我们是无法使用mongodb的,我们还是要将它添加到环境变量中。

创建一个MongoDB_HOME=D:\JAVA\mongodb,然后在将%MongoDB_HOME%\bin加入到path目录

MangoDB快速入门

这个时候我们运行cmd打开小黑屋运行命名:mongod,这个时候运行是失败的:

MangoDB快速入门

错误原因是:c:data\db\这个目录不存在,最简单的办法就是创建一个,不过个人不喜欢把文件放在C盘,并且以这种方式启动会一直有个窗口感觉非常不爽。

在服务中运行:

我们首先在mongoDB安装后的bin目录里创建一个mongod.cfg,里面添加如下内容

systemLog:
    destination: file
    path: D:\JAVA\mongodb\log\mongodb.log #如果没有目录必须要创建
storage:
    dbPath: D:\JAVA\mongodb\db\ #如果没有目录必须要创建

使用mongod --config "D:\JAVA\mongodb\bin\mongod.cfg" –install --serviceName "MongoDB" 安装服务,需要管理员权限。

芒果DB服务命令:

net start MongoDB   #启动服务
net stop MongoDB   #关闭服务
mongod –remove     #移除服务(需要管理员权限。)
sc delete MongoDB   删除服务

我们使用命令之后这个时候我们的服务中会有个MongoDB服务并且在运行中。

这个时候我们就可以使用命令mongo连接上我们的数据库。

附上一张mongoDB参数列表图:

MangoDB快速入门

使用MongoDB的时候如果不喜欢黑窗口的可以去度娘问问gui界面。

数据库指令
/*查看当前数据库*/
show dbs;
/* 如果数据库不存在,则创建数据库,否则切换到指定数据库。
   注意:这里的数据库并不是一定要存在的,如果不存在,在创建文档时会自动创建。 
*/
use MyDB;
/*删除当前数据*/
MyDB.dropDatabase();
/*显示当前所在数据*/
db;
集合操作指令

查看当前所有集合: show collections;

创建集合语法: db.createCollection(name,options)

name:集合的名称,options:可选参数,指定有关内存大小及索引的选项。

删除集合语法:db.集合名.drop()

常用命令操作

Employee是我创建的一个集合

插入一条文档:

db.Employee.insertOne({name:"SimpleWu",Email:"lovelyWu@gmail.com",QQ:450255266});

插入多条文档:

db.Employee.insertMany([
    {
        name:"李白",
        Email:"libai@gmail.com",
        QQ:123456789
    },
    {
        name:"韩信",
        Email:"hanxin@gmail.com",
        QQ:987654231
    }
]);

插入一条文档或插入多条文档:

db.Employee.insert({name:"武则天",Email:"wuzetian@gmail.con",QQ:1111111});
db.Employee.insert([
    {
        name:"嬴政",
        Email:"yingzheng@gmail.com",
        QQ:555555
    },
    {
        name:"安琪拉",
        Email:"anqila@gmail.com",
        QQ:66666
    }
])

批量插入文档:

for(var i = 0 ; i <= 50000 ; i ++ ){
    db.Employee2.insert({num:"鲁班" + i + "号"});
}

注意我们这样插入文档50000条数据花费了将近20秒这是非常残酷的,我而我们可以这样优化,优化后只需要0.5秒。

var array = [];
for(var i = 0;i<=50000;i++){
    array.push({num:"鲁班"+ i +"号"});
}
db.Employee2.insert(array);

查询文档:

db.Employee.find();

注意:如果在插入时,不指定_id属性,则数据库会自动生成一个_id,取值为ObjectId()。如果指定了_id,则不会生成。

更新文档语法:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选,抛出异常的级别。

update默认会用update的对象替换原有对象:

db.Employee.update({name:"李白"},{name:"李小白"});

如果想修改指定的属性,而不是修改所有内容,则要使用修改操作符。 $set可以用来修改指定属性

db.Employee.update({name:"李小白"},{$set:{name:"李白"}});

$unset可以移除某个属性,移除属性的值可以随便填

db.Employee.update({name:"武则天"},{$unset:{QQ:""}});

如果匹配到多个,update也只会删除一条记录。要删除多条,需要使用multi属性

db.Employee.update({name:"SimpleWu"},{$set:{name:"LovelyWu"}},{mluti:true});

save() 方法通过传入的文档来替换已有文档。语法格式如下:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

document : 文档数据。 writeConcern :可选,抛出异常的级别。

注意:若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。

插入:

db.Employee.save({name:"SimpleWu",gender:"男",email:"lovelyWu98k@gmail.com"});


/*
    _id存在变成更新操作
*/
db.Employee.save({ _id:ObjectId("5bf7b8cde756c09cc38dd79f"),name:"Wu帅帅",gender:"男",email:"lovelyWu98k@gmail.com"});

删除文档语法remove() 方法:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)
  • query :(可选)删除的文档的条件。

  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。

  • writeConcern :(可选)抛出异常的级别。

    db.Employee.remove({gender:"男"});//删除所有符合条件的文档 db.Employee.remove({gender:"男"},{justOne:true});//删除一条 db.Employee.remove();//删除集合中所有文档

查询文档:

db.collection.find(query, projection)

参数说明query :可选,使用查询操作符指定查询条件

projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.col.find().pretty()

db.Employee.find({name:"SimpleWu"},{gender:0});//查询name是SimpleWu的文档数据,排除gender显示
db.Employee.find({name:"SimpleWu"},{gender:1});//查询name是SimpleWu的文档数据,只显示gender

注意这个0代表的就是排除,1代表的是要它不要其他的,在这里0和1不能混合使用 在这里需要注意不管是不是只显示gender反正我们的_id是特殊的一列,所以我们没有排除_id它绝对会显示出来 那么我们只要显示gender:1怎么办呢很简单在加个_id=1,但是上面不是说不能0和1混合使用吗? 在mongoDB中,主键是特殊的一个字段

条件运算符:

等值判断 $eq:

db.Employee.find({name:"SimpleWu"});
db.Employee.find({name:{$eq:"SimpleWu"}});

判断小于$lt:

db.Employee.find({QQ:{$lt:450255266}});

判断大于$gt:

db.Employee.find({QQ:{$gt:450255266}});

判断小于等于$elt:

db.Employee.find({QQ:{$elt:450255266}});

判断大于等于egt:

db.Employee.find({QQ:{$egt:450255266}});

与条件判断:

//判断name=SimpleWu 同时gender=男
db.Employee.find({name:"SimpleWu",gender:"男"});

或条件判断:

db.Employee.find({$or:[{name:"武则天"},{name:"SimpleWu"}]});

学习某一项技术首先查询官方文档,官方文档是最全的,并且跟着官方文档走可以让我们少掉进许多坑。

总结:

文档是Mongodb中的最基本数据单元,类似于关系数据库中的行。

在mongodb中,文档的键通常都是字符串。Mongodb对文档的键是区分大小写的,对键值是区分数据类型的

MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型.与数据库打交 道的那些应用。

MongoDB文档的字段非常灵活

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这