下载地址
http://dl.mongodb.org/dl/win32/x86_64
这里用的版本是
mongodb-win32-x86_64-v3.4-latest-signed.msi


同时下载 mongodb-compass 下载地址
https://www.mongodb.com/products/compass
这里用到版本是
mongodb-compass-1.12.4-win32-x64.exe
mongodb-compass安装一路next,直至安装完成


MongoDB安装,选择Custom
安装目录选择
D:\ApacheServer\MongoDB


安装完成后
要手动创建数据目录
在安装目录下创建data文件夹,这里是
D:\ApacheServer\MongoDB\data


进入到安装目录
d:
cd ApacheServer/MongoDB/bin



启动MongoDB有两种方法
第一种直接在命令行中启动,如下
运行 MongoDB 并关联数据目录,执行成功后显示一长串信息
mongod --dbpath D:\ApacheServer\MongoDB\data



第二种办法将MongoDB注册到服务中,在命令行中使用 net start MongoDB 或 net stop MongoDB 即可控制启动停止服务
在 D:\ApacheServer\MongoDB 下创建文件mongod.cfg
并在其中设置内容
//===============================以下代码为mongod.cfg文件中内容==========================================
systemLog:
  destination: file
  path: D:\ApacheServer\MongoDB\mongod.log
storage:
  dbPath: D:\ApacheServer\MongoDB\data
//===============================以上代码为mongod.cfg文件中内容==========================================

然后在命令行中输入
mongod.exe --config "D:\ApacheServer\MongoDB\mongod.cfg" --install

启用MongoDB
net start MongoDB

如需要移除MongoDB服务执行
mongod.exe --remove









启动MongoDB后即可打开MongoDB Compass
输入localhost,端口号默认27017即可,刚创建的MongoDB没有用户名密码





MongoDB 里一维数组(文档)都是要指定属于哪个表(集合)的,一个一维数组就是一条表数据,而数组里的键值(字段名)可随意添加删减,相当于所属表就自动添加删除该字段
当该表下所有的数组都删除了某字段,则相当该表也没了该字段
MongoDB在表里添加一条新数组(文档)时,会自动在数组中添加 _id 字段并设置为主键
MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
需要注意的是:
1.文档中的键/值对是有序的。
2.文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3.MongoDB区分类型和大小写。
4.MongoDB的文档不能有重复的键。
5.文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。









MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
如果需要进入MongoDB Shell后台管理,需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,这里是
D:\ApacheServer\MongoDB\bin\mongo.exe
鼠标双击打开即可
进入mongoDB后台后,会默认链接到 test 数据库:

在 MongoDB Shell 中直接输入 db 回车,查看当前操作的数据库
db
显示
test







show dbs 命令可以显示所有数据的列表,输入
show dbs
显示
admin  0.000GB
local  0.000GB
test   0.000GB







use 数据库名 : 如果数据库不存在,则创建数据库,否则切换到指定数据库。刚创建的库用 show dbs 查看不会显示,需要往库中插入数据后才显示
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin  : 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local  : 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config : 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
输入
use local
显示
switched to db local








删除当前数据库,删除后用db查看当前数据库名不变,但是输入show dbs显示的数据库列表中已没有当前库
db.dropDatabase()








查看当前库的集合(数据表)列表
show tables
或
show collections







创建集合(表)
MongoDB 中,其实不需要创建集合。当向某个新集合插入文档时,如果该集合不存在 MongoDB 会自动创建集合
创建集合语法
db.createCollection(tablename, {options:value})
参数说明:
tablename : 要创建的集合名称
options   : 可选参数, 指定有关内存大小及索引的选项

options 可以是如下参数:
capped      : 布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档(条记录)。默认为 false。当该值为 true 时,必须指定 size 参数。
autoIndexId : 布尔(可选)如为 true,自动在 _id 字段创建索引,默认为 false。如果建表时添加该选项创建成功后会有提示,该参数在将来版本中会取消。
size        : 数值(可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。
max         : 数值(可选)指定固定集合中包含文档的最大数量。
例创建testtable表,输入
db.createCollection("testtable")
或者带参数的输入
db.createCollection("testtable",{capped:true,autoIndexId:true,size:6142800,max:10000})







删除集合(表)
这里删除 testtable 集合(表)
db.testtable.drop()









插入一些简单的记录
向 testtable 表插入 title、tags、likes字段的值
testtable 表和 title 等字段如不存在会被自动创建
方法一,直接输入
db.testtable.insert({title:'MongoDB',tags:['mongodb','database','NoSQL'],likes:100})
显示
WriteResult({ "nInserted" : 1 })
方法二,或者将要插入的值保存到一个变量中,再将该变量插入到表中
例,将值保存到 testvar 变量中
testvar=({title:'MongoDB',tags:['mongodb','database','NoSQL'],likes:100})
再将该变量插入到表中
db.testtable.insert(testvar)
显示
WriteResult({ "nInserted" : 1 })
执行插入时可将返回值赋给一个变量,命令行里输入该变量将打印出返回信息,插入单条或多条记录时均可
例
var resualt = db.testtable.insert({title:'MongoDB',tags:['mongodb','database','NoSQL'],likes:100})
再输出
resualt
显示
WriteResult({ "nInserted" : 1 })










一次插入多条数据
db.testtable.insert([{testfield:'testval1'},{testfield:'testval2'}])
或
testvar=([{testfield:'testval1'},{testfield:'testval2'}])
db.testtable.insert(testvar)










更新文档
这里需要注意的是,固定集合中文档的大小不能改变,否则更新会报错
语法格式如下:
db.tablename.update( where, update, {options:value})
参数说明:
where  : update 的查询条件,类似sql 的 where 条件。
update : update 的对象和一些更新的操作符(如$set,$inc...)等,也可以理解为sql update查询内set后面的

options 可以是如下参数:
upsert       : 可选,这个参数的意思是,如果不存在update的记录,是否插入新记录,true为插入,默认是false,不插入。
multi        : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern : 可选,抛出异常的级别。
例
db.testtable.update({'testfield':'testval1'},{$set:{'testfield':'testval13'}})










替换文档
语法格式如下:
db.tablename.save(document, {options:value})
参数说明:
document : 文档数据。

options 可以是如下参数:
writeConcern : 可选,抛出异常的级别。
例,将表中 _id 为 5ab48f66d4226cbbff985283 的记录整条替换为新的记录,之前记录的一切字段作废被替换新的内容
db.testtable.save({'_id':ObjectId('5ab48f66d4226cbbff985283'),'title':'MongoDB_test'})












删除文档
方法一
语法格式如下
db.tablename.remove(where, justOne)
参数说明:
where   : 可选 删除的文档的条件。
justOne : 可选 如果设为 true 或 1,则只删除一个文档。默认 false 符合条件的全删。
例
db.testtable.remove({'title':'MongoDB_test'})
删除一条数据
db.testtable.remove({'title':'MongoDB_test'},1)
删除全部数据
db.testtable.remove({})
方法二
语法格式如下
删除一条
db.tablename.deleteOne(where)
或
删除多条
db.tablename.deleteMany(where)
例
db.testtable.deleteOne({'title':'MongoDB_test'})
或
db.testtable.deleteMany({'title':'MongoDB_test'})











查询表内文档
db.tablename.find(where, {fieldname : val})
参数说明:
where     : 可选,使用查询操作符指定查询条件,不加条件则查询获取整个表内所有文档(条数据)
fieldname : 可选,fieldname 为文档中键值名,表示返回显示或不显示指定的键,val 值为1或0。若不加 fieldname 参数则查询时返回文档中所有键值(默认省略fieldname参数)。
如有多个 fieldname 参数则其 val 值必须都一样,全是1则只返回显示指定的 fieldname 键值,全是0则返回结果隐藏指定的 fieldname 键值

pretty() 方法以格式化的方式来显示查询文档。
db.tablename.find(where, projection).pretty()

只返回一个文档,显示内容会自动格式化,不用加 pretty()。
db.tablename.findOne(where, projection)

where 查询条件
等于         -- fieldname : value
小于         -- fieldname : {$lt : value}
小于等于  -- fieldname : {$lte : value}
大于         -- fieldname : {$gt : value}
大于等于 -- fieldname : {$gte : value}
不等于     -- fieldname : {$ne : value}
例查询 testtable 表
and条件 相当于 where testfield = 'testval1' and testfield2 = 'testval11'
db.testtable.find({testfield:'testval1',testfield2:'testval11'})
or条件 相当于 where testfield = 'testval1' or testfield2 = 'testval22'
db.testtable.find({$or:[{testfield:'testval1'},{testfield2:'testval22'}]})
and和or联合使 用相当于 where testfield3 > 100 and (testfield = 'testval1' or testfield2 = 'testval22')
db.testtable.find({testfield3:{$gt:100}, $or:[{testfield:"testval1"}, {testfield2:"testval22"}]})












返回结果条数限制
db.tablename.find().skip(int).limit(int)
skip  接受一个数字参数,为返回结果中,跳过指定的条数再显示
limit 接受一个数字参数,为返回结果中,限制显示的条数
例
显示除第一条以下的数据
db.testtable.find().skip(1)
只显示第一条数据
db.testtable.find().limit(1)
只显示第二条数据
db.testtable.find().skip(1).limit(1)









返回结果排序
db.tablename.find().sort({fieldname : val})
参数说明:
fieldname : 指定要排序的键值名
val       : 值为 1 升序排列或 -1 降序排列。
skip(),limilt(),sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
例
db.testtable.find().sort({testfield3 : 1})











MongoDB 常用的几种数据类型

String             : 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer            : 整型数值。用于存储数值。根据所采用的服务器,可分为 32 位或 64 位。
Boolean            : 布尔值。用于存储布尔值(真/假)。
Double             : 双精度浮点值。用于存储浮点值。
Min/Max keys       : 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array              : 用于将数组或列表或多个值存储为一个键。
Timestamp          : 时间戳。记录文档修改或添加的具体时间。
Object             : 用于内嵌文档。
Null               : 用于创建空值。
Symbol             : 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date               : 日期时间。用 UNIX 时间格式来存储当前日期或时间。可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID          : 对象 ID。用于创建文档的 ID。
Binary Data        : 二进制数据。用于存储二进制数据。
Code               : 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression : 正则表达式类型。用于存储正则表达式。


writeConcern 抛出异常的级别
NONE          : 没有异常抛出。
NORMAL        : 仅抛出网络错误异常,没有服务器错误异常。
SAFE          : 抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
MAJORITY      : 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
FSYNC_SAFE    : 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
JOURNAL_SAFE  : 抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
REPLICAS_SAFE : 抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。