文档章节

mongoDB常用命令

y
 yuu2lee4
发布于 2016/06/20 14:57
字数 2246
阅读 2
收藏 0
点赞 0
评论 0

来自 • kiinlam github

安装

mongoDB官网下载安装(Windows安装方法

基础知识

集合——对应关系数据库中的表

文档——对应关系数据库中的行

启动数据库服务

定位到安装目录下的bin文件夹里后

> mongod --dbpath ../data/db

如没有data/db文件夹,需先创建,dbpath用于指定数据存放位置

开启一个客户端访问数据库

同样的bin文件夹下执行

> mongo

默认连接至test数据库

显示帮助

> help

显示所有数据库名称

> show dbs

切换数据库

> use test

显示当前连接的数据库名称

> db

显示当前数据库所有集合

> show collections

显示数据库支持的方法

> db.help()

显示集合支持的方法

> db.users.help()

创建集合

> db.createCollection("users")

插入操作insert

> db.users.insert({"name":"kiinlam","age":28})

查询操作find

查找所有文档

> db.users.find()

####查找指定文档

> db.users.find({"name":"kiinlam"})

查询一条

> db.users.findOne({"name":"kiinlam"})

大于$gt

> db.users.find({"age":{$gt:22}})

大于等于$gte

> db.users.find({"age":{$gte:22}})

小于$lt

> db.users.find({"age":{$lt:22}})

小于等于$gte

> db.users.find({"age":{$lte:22}})

不等于$ne

> db.users.find("age":{$ne:22})

或$or

> db.users.find({$or:[{"name":"kiinlam"},{"name":"cheungkiinlam"}]})

在集合中$in

> db.users.find("name":{$in:["kiinlam","cheungkiinlam"]})

不在集合中$nin

> db.users.find("name":{$nin:["kiinlam","cheungkiinlam"]})

正则查询

> db.users.find({"name":/^k/,"name":/m$/})

筛选查询$where

// 使用js function作为筛选条件 > db.users.find({$where: function(){return this.name=='kiinlam'}})

限制查询数量limit

> db.users.find({"age":22}).limit(10)

更新操作update

指定文档全部更新,等于覆盖

> db.users.update({"name":"kiinlam"}, {"name":"cheungkiinlam","age":27})

局部更新一:增量更新$inc

// age增加2,其他不变 > db.users.update({"name":"kiinlam"}, {$inc:{"age":2}})

局部更新二:字段修改$set

// age改为20 > db.users.update({"name":"kiinlam"}, {$set:{"age":20}})

新增更新:如果不存在,就新增一条

// 第三个参数为true > db.users.update({"name":"kiinlam"}, {$set:{"age":18}}, true)

批量更新

// 如果匹配多条,默认只改第一条,将第四个参数设为true可全部更新 > db.users.update({"name":"kiinlam"}, {$set:{"age":18}}, true, true)

保存操作save

// 插入新文档,如果不提供"_id"字段 > db.users.save({"name":"kiinlam", "age":28}) // 更新已存在的文档 > db.users.save({"_id":"xxx","name":"kiinlam", "age":28})

删除操作remove

删除操作不可恢复

删除所有,但不删除索引

> db.users.remove({})

删除指定文档

> db.users.remove({"name":"kiinlam"})

删除一条指定文档,如果有多条结果

> db.users.remove({"name":"kiinlam"}, true)

完全删除集合,包括索引,应当使用drop

大量删除时,采用复制需要保留的文档到新集合,再用drop删除集合。

删除数据库

> db.dropDatabase()

删除集合

> db.users.drop()

计数操作count

> db.users.count() > db.users.count({"age":29})

唯一值查询distinct

指定字段有多个相同时,只取一个,返回指定字段的值组合成的数组

> db.users.distinct("age")

分组操作group

按照age进行分组操作,分组结果存放在user中,值为对应age的name值的数组

key:分组依据

initial:初始化函数,每个不同的age组共享同一个函数

$reduce: 第一个参数为当前文档,第二参数为前一次函数操作的累计对象,第一次为initial对应的对象

> db.users.group({ "key": {"age": true}, "initial": {"user": []}, "$reduce": function(cur,prev){ prev.user.push(cur.name); } })

假设有数据如下:

{ "_id" : ObjectId("55910457607379845607d9e2"), "name" : "kiinlam", "age" : 29 } { "_id" : ObjectId("55910468607379845607d9e3"), "name" : "shadow", "age" : 26 } { "_id" : ObjectId("55910992607379845607d9e5"), "name" : "foo", "age" : 29 } { "_id" : ObjectId("55911fca607379845607d9e6"), "name" : "dd", "age" : 22 } { "_id" : ObjectId("55911fd3607379845607d9e7"), "name" : "mm", "age" : 22 } { "_id" : ObjectId("55911fdf607379845607d9e8"), "name" : "gg", "age" : 22 } { "_id" : ObjectId("55911feb607379845607d9e9"), "name" : "jj", "age" : 22 } { "_id" : ObjectId("55920545ff40738c1fd0a839"), "name" : "zz", "age" : 1 }

分组结果为:

[ { "age" : 29, "user" : [ "kiinlam", "foo" ] }, { "age" : 26, "user" : [ "shadow" ] }, { "age" : 22, "user" : [ "dd", "mm", "gg", "jj" ] }, { "age" : 1, "user" : [ "zz" ] } ]

更多分组功能

可选参数: condition finalize

`condition` —— 过滤条件 `finalize` —— 函数,分组完成后执行

过滤掉age大于22的文档,增加属性标明分组中文档的数量

> db.users.group({ "key": {"age": true}, "initial": {"user": []}, "$reduce": function(cur,prev){ prev.user.push(cur.name); }, "condition": {"age":{$lte:22}}, "finalize": function(out){ out.count = out.user.length; } })

分组结果为:

[ { "age" : 22, "user" : [ "dd", "mm", "gg", "jj" ], "count" : 4 }, { "age" : 1, "user" : [ "zz" ], "count" : 1 } ]

mapReduce

map:映射函数,内部调用emit(key,value),集合按照key进行映射分组。

reduce:简化函数,对map分组后的数据进行分组简化,reduce(key,value)中的keyemit中的key,而value则是emit分组结果的集合。

mapReduce:最后执行的函数,参数为mapreduce和一些可选参数。

> db.users.mapReduce function ( map , reduce , optionsOrOutString ){ var c = { mapreduce : this._shortName , map : map , reduce : reduce }; assert( optionsOrOutString , "need to supply an optionsOrOutString" ) if ( typeof( optionsOrOutString ) == "string" ) c["out"] = optionsOrOutString; else Object.extend( c , optionsOrOutString ); var raw = this._db.runCommand( c ); if ( ! raw.ok ){ __mrerror__ = raw; throw Error( "map reduce failed:" + tojson(raw) ); } return new MapReduceResult( this._db , raw ); }

创建map函数

function (){ emit(this.name,{count:1}); }

创建reduce函数

function (key,value){ var result = {count:0}; for(var i = 0; i < value.length; i++){ result.count += value[i].count; } return result; }

执行mapReduce操作

> db.users.mapReduce(map,reduce,{"out":"collection"})

假设有数据如下

{ "_id" : ObjectId("55910457607379845607d9e2"), "name" : "kiinlam", "age" : 29 } { "_id" : ObjectId("55910468607379845607d9e3"), "name" : "shadow", "age" : 26 } { "_id" : ObjectId("55910992607379845607d9e5"), "name" : "foo", "age" : 29 } { "_id" : ObjectId("55920545ff40738c1fd0a839"), "name" : "zz", "age" : 1 } { "_id" : ObjectId("55911fca607379845607d9e6"), "name" : "foo", "age" : 22 } { "_id" : ObjectId("55911fd3607379845607d9e7"), "name" : "foo", "age" : 22 } { "_id" : ObjectId("55911fdf607379845607d9e8"), "name" : "foo", "age" : 22 } { "_id" : ObjectId("55911feb607379845607d9e9"), "name" : "foo", "age" : 22 }

输出结果

{ "result" : "collection", // 存放最终结果的集合名 "timeMillis" : 28, "counts" : { "input" : 8, // 传入文档的次数 "emit" : 8, // emit函数被调用次数 "reduce" : 1, // reduce函数被调用次数 "output" : 4 // 最后返回文档的个数 }, "ok" : 1 }

查看集合collection中的结果

> db.collection.find()

输出结果

{ "_id" : "foo", "value" : { "count" : 5 } } { "_id" : "kiinlam", "value" : { "count" : 1 } } { "_id" : "shadow", "value" : { "count" : 1 } } { "_id" : "zz", "value" : { "count" : 1 } }

游标

游标只表示一个引用,并不是真正的执行,在需要的时候,通过for循环或next()方法进行遍历读取,枚举结束后,游标销毁,不再返回数据。

申明一个游标

> var list = db.collection.find()

通过forEach遍历游标

> list.forEach(function(i){ print(i._id); })

输出结果

foo kiinlam shadow zz

或者通过next遍历集合

> var list = db.collection.find() > list.next() { "_id" : "foo", "value" : { "count" : 5 } } > list.next() { "_id" : "kiinlam", "value" : { "count" : 1 } } > list.next() { "_id" : "shadow", "value" : { "count" : 1 } } > list.next() { "_id" : "zz", "value" : { "count" : 1 } } > list.next() 2015-07-01T11:27:38.186+0800 E QUERY Error: error hasNext: false at Error (<anonymous>) at DBQuery.next (src/mongo/shell/query.js:255:15) at (shell):1:6 at src/mongo/shell/query.js:255 > list >

索引ensureIndex

建立索引

// 1为升序,-1为降序 > db.users.ensureIndex({"name":1})

唯一索引

> db.users.ensureIndex({"name":1},{"unique":true})

组合索引

> db.users.ensureIndex({"name":1, "age":-1})

查看索引

> db.users.getIndexes()

按指定索引查询

> db.users.find({"name":"kiinlam"}).hint({"name":1,"age":1})

删除索引

// 删除所有自定义索引 > db.users.dropIndexes() // 删除指定索引 > db.users.dropIndex("name_1")

性能分析函数explain

> db.users.find().explain("executionStats")

主从数据库部署

创建主数据库master

> mongod --dbpath=XXX --master

创建从数据库slave

// 指定从数据库端口--port // 指定主数据库源--source > mongod --dbpath=XXX --port=8888 --slave --source=127.0.0.1:27017

后期指定主数据库源

> mongod --dbpath=XXX --port=8888 --slave // 后期添加源 // 切换到local数据库 > use local // 在sources中加入源地址 > db.sources.insert({"host":"127.0.0.1:27017"})

副本集replSet

该架构没有特定的主数据库,一个数据库宕机了,另一个数据库会顶上

创建第一个数据库服务器

// 需要指定集群名及下一个数据库地址 > mongod --dbpath=XXX --port 2222 --replSet mySet/127.0.0.1:3333

创建第二个数据库服务器

> mongod --dbpath=XXX --port 3333 --replSet mySet/127.0.0.1:2222

初始化副本集

// 进入任一数据库的admin集合 > mongo 127.0.0.1:2222/admin // 执行初始化操作 > db.runCommand({ "replSetInitiate":{ "_id":"mySet", "members":[ { "_id":1, "host":"127.0.0.1:2222" }, { "_id":2, "host":"127.0.0.1:3333" } ] } })

仲裁服务器

// 启动仲裁服务器 > mongod --dbpath=XXX --port 4444 --replSet mySet/127.0.0.1:2222 // 回到admin集合中添加仲裁服务器 > mongo 127.0.0.1:2222/admin > rs.addArb("127.0.0.1:4444") // 查看服务器集群状态 > rs.status()

分片技术

将集合进行拆分,将拆分的数据均摊到几个分片上。

主要参与者:

  • 客户端
  • 路由服务器mongos
  • 配置服务器
  • 分片数据库实例

开启配置服务器config

> mongod --dbpath=XXX --port 2222

开启路由服务器mongos

// 指定配置服务器 > mongos --port 3333 --configdb=127.0.0.1:2222

开启分片数据库服务器mongod

> mongod --dbpath=XXX --port 4444 > mongod --dbpath=XXX --port 5555

服务配置

// 进入mongos数据库admin集合 > mongo 127.0.0.1:3333/admin // 添加分片服务器addshard > db.runCommand({ "addshard":"127.0.0.1:4444", "allowLocal":true }) > db.runCommand({ "addshard":"127.0.0.1:5555", "allowLocal":true }) // 开启数据库test的分片功能enablesharding > db.runCommand({"enablesharding":"test"}) // 指定集合中分片的片键users.name > db.runCommand({"shardcollection":"test.users","key":{"name":1}}) // 在mongos中查看数据分片情况 > use test > db.printShardingStatus()

运维

运维通常会涉及到以下4个方面

  • 安装部署
  • 状态监控
  • 安全认证
  • 备份和恢复

安装部署为windows服务

// 指定日志路径,添加install参数 > mongod --dbpath=XXX --logpath=XXX --port=2222 --install // 启动服务 > net start MongoDB

状态监控

静态统计

db.stats()

// 查看单个数据库状态 > db.stats()

stats比较简单,可以参考db.stats()一文

db.serverStatus()

// 查看整个mongodb的状态 // 进入admin集合 > mongo 127.0.0.1:2222/admin // 查看状态 > db.serverStatus()

serverStatus的参数很多,可以参考db.serverStatus()一文

实时统计
> mongostat --port 2222

安全认证

TODO

有点复杂,偷懒了,参考安全认证

备份和恢复

// 备份test数据库到D:\mongodb\backup > mongodump --port 2222 -d test -o D:\mongodb\backup // 恢复数据,drop表示恢复前删除原有数据 > mongorestore --port 2222 -d test --drop D:\mongodb\backup

参考资料

本文转载自:http://blog.csdn.net/yuu2lee4/article/details/46891595

共有 人打赏支持
y
粉丝 1
博文 20
码字总数 0
作品 0
程序员
Docker MongoDB 部署

MongoDB 是一款较为常用的NOSQL 数据库,结合 Docker 使用,能实现轻松配置部署、迁移,本文以下为简要介绍如何在 Docker 中部署并使用 MongoDB。下文主要分为几个部分,内容如下: MongoDB ...

speculatecat ⋅ 04/06 ⋅ 0

CentOS7.X安装mongodb-3.4.2

安装mongodb 下载安装mongodb3.4.x 加入环境变量 创建数据目录 修改配置文件 启动关闭mongodb 开机启动mongodb Mongodb集群(cluster) 修改mongodb.conf 启动mongodb 初始化mongodb,启动副本集...

qq2233466866 ⋅ 06/11 ⋅ 0

mongodb的命令行操作命令详解(增删改查、高级查询)

mongodb的命令行操作命令详解(增删改查、高级查询) 本文为上文的续篇,主要讲解mongodb在cmd的直接操作命令,我的mongodb是安装在d:mongodb下 1,mongodb启动服务 : 2,mongodb停止服务 : ...

xiaocao13140 ⋅ 06/04 ⋅ 0

mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、等等)

最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的...

Airship ⋅ 06/01 ⋅ 0

如何在Ubuntu 18.04 LTS上安装和配置MongoDB

如何在Ubuntu 18.04 LTS上安装和配置MongoDB IMCN 18分钟前暂无评论 阅读 9 次 MongoDB是一款非关系型数据库,提供高性能,高可用性和自动扩展企业数据库。 MongoDB是一个非关系型数据库,因...

IMCN ⋅ 05/05 ⋅ 0

Mac和Ubuntu18.04下MongoDB的安装

Mac安装mongodb 使用安装 从默认的配置文件启动mongodb 安装完成后,MongoDB服务启动、停止、重启命令如下: Mac下的mongodb可视化管理工具,推荐使用开源免费的, 下载地址:https://robomon...

翌日千里 ⋅ 05/26 ⋅ 0

waylau/mongodb-file-server

MongoDB File Server(基于 MongoDB 的文件服务器) MongoDB File Server is a file server system based on MongoDB. MongoDB File Server is committed to the storage of small files, su......

waylau ⋅ 04/26 ⋅ 0

在 EMR 中使用 Mongo-Hadoop

在 EMR 中使用 Mongo-Hadoop Mongo-Hadoop 是 MongoDB 推出的用于 Hadoop 系列组件连接 MongoDB 的组件。其原理跟我们上一篇文章介绍的 ES-Hadoop 类似。EMR 中已经集成了 Mongo-Hadoop,用户...

xy_xind ⋅ 前天 ⋅ 0

MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999 ⋅ 05/02 ⋅ 0

Node后台|数据库的安装及使用(简版)

MAC 安装mongoDB 启动 mongoDB 判断mongoDB是否已经开启 关闭 mongoDB的服务 mongodb启动成功后会显示 然后我们去看看node如何连接mongodb node 连接mongoDB需要用到 mongoose 如果连接成功的...

贝一平 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 36分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 51分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 今天 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部