MongoDB

Posted FAN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB相关的知识,希望对你有一定的参考价值。

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

它的特点:高性能、易部署、易使用,存储数据非常方便。

数据库本质是文件管理系统

MongoDB:非关系型数据库,(不同于关系型数据库二维存储的概念,如:mysql,oracle,)

详细文档见:http://www.runoob.com/mongodb/mongodb-window-install.html

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

windows下:

配置环境变量,path追加安装目录的bin路径(注意分号) 

;D:\\MongoDB\\Server\\3.0\\bin

 

注:若不配置环境变量则需从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件,开启mongo命令

在d盘下新建data/db两个文件夹,创建数据库:

mongod --dbpath d:/data/db

注:执行 mongod --dbpath d:/data/db --rest,可以直接通过web界面查询数据,执行mongod命令。默认地址:http://localhost:28017

注:执行 mongod --dbpath d:/data/db --auth,开启权限管理。默认情况下,mongod也是没有管理员账户的。因此除非你在admin数据库中使用db.addUser()命令添加了管理员帐号,且使用–auth参数启动mongod,否则在数据库中任何人都可以无需认证执行所有命令。包括delete和shutdown。详见:http://www.cnblogs.com/valor-xh/p/6369432.html

注:其他启动参数:

  • --dbpath <db_path>:存储MongoDB数据文件的目录
  • --directoryperdb:指定每个数据库单独存储在一个目录中(directory),该目录位于--dbpath指定的目录下,每一个子目录都对应一个数据库名字。
  • --logpath <log_path>:指定mongod记录日志的文件
  • --fork:以后台deamon形式运行服务
  • --journal:开始日志功能,通过保存操作日志来降低单机故障的恢复时间
  • --config(或-f)<config_file_path>:配置文件,用于指定runtime options
  • --bind_ip <ip address>:指定对外服务的绑定IP地址
  • --port <port>:对外服务窗口
  • --auth:启用验证,验证用户权限控制
  • --syncdelay<value>:系统刷新disk的时间,单位是second,默认是60s
  • --replSet <setname>:以副本集方式启动mongod,副本集的标识是setname

另起窗口,cmd中输入 mongo 开启mongo命令

在启动mongo shell时,常用的参数是:

  • --nodb: 阻止mongo在启动时连接到数据库实例;
  • --port <port> :指定mongo连接到mongod监听的TCP端口,默认的端口值是27017;
  • --host <hostname> :指定mongod运行的server,如果没有指定该参数,那么mongo尝试连接运行在本地(localhost)的mongod实例;
  • <db address>:指定mongo连接的数据库
  • --username/-u <username> 和 --password/-p <password>:指定访问MongoDB数据库的账户和密码,只有当认证通过后,用户才能访问数据库;
  • --authenticationDatabase <dbname>:指定创建User的数据库,在哪个数据库中创建User时,该数据库就是User的Authentication Database;

执行查看命令

mongod show dbs

 mac下启动:

配置 MongoDB 服务

通过以上的配置已经可以进行MongoDB的数据库操作了,但每次都得使用 mongod --dbpath d:/data/db 命令来启动数据库,而且这个启动的的窗口不能被关闭,否则数据库服务也就关闭了。可以通过注册windows服务来解决。

在原来d盘下data文件夹中再新建一个log文件夹

在安装MongoDB的文件夹下,新建文件mongod.cfg,其中指定 systemLog.path 和 storage.dbPath。具体配置内容如下:

systemLog:
    destination: file
    path: D:\\data\\log\\mongod.log
storage:
    dbPath: D:\\data\\db

安装 MongoDB服务

通过执行mongod.exe,使用--install选项来安装服务,使用--config选项来指定之前创建的配置文件。

mongod --config D:\\MongoDB\\Server\\3.0\\mongod.cfg --install
要使用备用 dbpath,可以在配置文件(例如:C:\\mongodb\\mongod.cfg)或命令行中通过 --dbpath 选项指定。如果需要,您可以安装 mongod.exe 或 mongos.exe 的多个实例的服务。只需要通过使用 --serviceName 和 --serviceDisplayName 指定不同的实例名。只有当存在足够的系统资源和系统的设计需要这么做。

启动MongoDB服务

net start MongoDB


关闭MongoDB服务
net stop MongoDB

移除MongoDB服务

mongod --remove

 配置成服务后就能够通过 net start MongoDB 和 net stop MongoDB 来开启和关闭服务

MongoDB术语/概念

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

示例:

一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。


  MongoDB 集合
  集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
  集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
  MongoDB 文档
  文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
  一个简单的文档例子如下:

{"genres": ["犯罪","剧情" ],"title": "肖申克的救赎"}

常用命令:

#Help查看命令提示
help
db.help()
db.test.help()
db.test.find().help()
#创建/切换数据库
use music
#查询数据库
show dbs
#查看当前使用的数据库
db/db.getName()
#查看当前数据库的所有集合
show collections  #显示当前DB状态 db.stats() #查看当前DB版本 db.version() #查看当前DB的链接机器地址 db.getMongo() #删除数据库 db.dropDatabase()

  Collection集合操作: 

#创建一个集合
db.createCollection("collName", {size: 20, capped: true, max: 100});
db.collName.isCapped(); //判断集合是否为定容量
#得到指定名称的集合
db.getCollection("account");
#得到当前db的所有集合
db.getCollectionNames();
#显示当前db所有集合的状态
db.printCollectionStats();

  添加、修改与删除集合数据

#添加
db.users.save({name: ‘zhangsan\', age: 25, sex: true});
#添加多条数据
db.users.save([{...},{...},...,{....}])
#db.users.insert(),db.users.insertOne()
#修改
db.users.update({age: 25}, {$set: {name: \'changeName\'}}, false, true);
#相当于:update users set name = \' changeName\' where age = 25;
db.users.update({name: \'Lisi\'}, {$inc: {age: 50}}, false, true);
#相当于:update users set age = age + 50 where name = \'Lisi\';
db.users.update({name: \'Lisi\'}, {$inc: {age: 50}, $set: {name: \'hoho\'}}, false, true);
#相当于:update users set age = age + 50, name = \'hoho\'  where name = \'Lisi\';
#删除
db.users.remove({age: 132});
#可以使用正则表达式:如
db.users.remove({age: /132/});
#删除全部:db.users.remove({});
#删除集合
db.users.drop()

 集合数据查询

#查询所有记录
db.userInfo.find();
#相当于:select* from userInfo;
#查询去重后数据
db.userInfo.distinct("name");
#相当于:select distict name from userInfo;
#查询age = 22的记录
db.userInfo.find({"age": 22});
#相当于: select * from userInfo where age = 22;
#查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
#相当于:select * from userInfo where age > 22;
#查询age < 22的记录
db.userInfo.find({age: {$lt: 22}});
相当于:select * from userInfo where age < 22;
#查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
#相当于:select * from userInfo where age >= 25;
#查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
#查询age >= 23 并且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
#查询name中包含 mongo的数据
db.userInfo.find({name: /mongo/});
#相当于%%
select * from userInfo where name like \'%mongo%\';
#查询name中以mongo开头的
db.userInfo.find({name: /^mongo/});
#相当于: select * from userInfo where name like \'mongo%\';
#查询指定域name、age数据,注意:1表示true,0表示false,即是否显示
db.userInfo.find({}, {name: 1, age: 1});
#嵌套查询:db.userInfo.find({}, {name: 1, age: 1,info.address});
#相当于:select name, age from userInfo;
#查询指定列name、age数据, age > 25 db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
#相当于:select name, age from userInfo where age >25;
#按照年龄排序 #升序:db.userInfo.find().sort({age: 1}); 
#降序:db.userInfo.find().sort({age: -1}); 
#查询name = zhangsan, age = 22的数据 db.userInfo.find({name: \'zhangsan\', age: 22}); 
#相当于:select * from userInfo where name = \'zhangsan\' and age = ’22\'; 
#查询前5条数据 db.userInfo.find().limit(5); 
#相当于:select top 5 * from userInfo; 
#查询10条以后的数据 db.userInfo.find().skip(10); 
#相当于:select * from userInfo where id not in (select top 10 * from userInfo); 
#查询在5-10之间的数据,limit与skip执行顺序无关,sort优先级大于skip,skip优先级大于limit db.userInfo.find().limit(10).skip(5); 
#or与 查询 db.userInfo.find({$or: [{age: 22}, {age: 25}]}); 
#相当于:select * from userInfo where age = 22 or age = 25; 
#查询第一条数据 db.userInfo.findOne(); 
#相当于:select top 1 * from userInfo;db.userInfo.find().limit(1); 
#查询某个结果集的记录条数 db.userInfo.find({age: {$gte: 25}}).count(); 
#相当于:select count(*) from userInfo where age >= 20;
#包含与不包含
db.userInfo.find({gender:{$in[\'男\']}},{name:1})
db.userInfo.find({gender:{$nin[\'男\']}},{name:1})

可视化工具: Robomongo 和 Mongochef

obomongo

Robomongo 是一个基于 Shell 的跨平台开源 MongoDB 可视化管理工具,支持 Windows、Linux 和 Mac,嵌入了 javascript 引擎和 MongoDB mongo,只要你会使用 mongo shell,你就会使用 Robomongo,它还提了供语法高亮、自动补全、差别视图等。

Robomongo 下载地址

MongoChef

MongoChef 是另一款强大的 MongoDB 可视化管理工具,支持 Windows、Linux 和 Mac。

MongoChef 下载地址(非商业用途免费)。

tips:MongoChef 相较于 Robomongo 更强大一些,但 Robomongo 比较轻量也能满足大部分的常规需求

 

 

mongodb 权限设置--用户名、密码、端口:http://www.cnblogs.com/valor-xh/p/6369432.html

MongoDB 安装和可视化工具:http://www.cnblogs.com/ljhdo/p/5793120.html

 

一些问题:

一、在mac系统下通过brew安装时,报错

http://www.runoob.com/mongodb/mongodb-osx-install.html

sudo brew install mongodb --with-openssl
Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.

解决方法:

1.执行,给 /usr/local 赋予写权限

sudo chown -R $(whoami) /usr/local

2.安装时命令不需要提权(去掉sudo)

brew install mongodb --with-openssl

 

以上是关于MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS