每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解
本篇主要介绍MongoDB可视化操作以及shell使用及命令。
MongoVUE安装和简单使用
使用mongo.exe 管理数据库虽然可行,功能也挺强大,但每次都要敲命令,即繁琐枯燥而且效率低下。MongoDb在Windows下的可视化操作的管理工具非常多,笔者从中找了几款使用了一翻,最后挑了一款MongoVUE来最简单介绍,因为笔者觉得MongoVUE界面看上去舒服些。
下载地址:http://www.mongovue.com/downloads/
注意:官方提供的是收费版,试用期15天。但是天朝的东西,你懂的,破解很容易。
运行效果如下图所示。

添加数据库连接之前,要先运行Mongo服务,然后添加Mongo数据库连接,如下图所示。



Document数据插入
> show collections
persons
system.indexes
> db.persons.find()
{ "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉杰" }
{ "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }
1.插入文档
db.[documentName].insert({})
2.批量插入文档
- shell这样执行是错误的:db.[documentName].insert([{},{},...])
- shell不支持批量插入
- 想完成批量插入可以使用Mongo的应用驱动或者是shell的for循环
> for(var i=0;i<10;i++){
... db.persons.insert({name:'test'+i})}
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉杰" }
{ "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafa"), "name" : "test0" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafb"), "name" : "test1" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafc"), "name" : "test2" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafd"), "name" : "test3" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafe"), "name" : "test4" }
{ "_id" : ObjectId("593b489e29b0f45384dfaaff"), "name" : "test5" }
{ "_id" : ObjectId("593b489e29b0f45384dfab00"), "name" : "test6" }
{ "_id" : ObjectId("593b489e29b0f45384dfab01"), "name" : "test7" }
{ "_id" : ObjectId("593b489e29b0f45384dfab02"), "name" : "test8" }
{ "_id" : ObjectId("593b489e29b0f45384dfab03"), "name" : "test9" }
>
3.Save操作
save操作和insert操作的区别在于当遇到_id相同的情况下,save完成保存操作,而insert则会报错
我们先来看下insert操作,先插入一条01的记录,然后再插入一条_id为01的记录会报错,因为_id重复了。
> db.persons.insert({_id:"",name:1})
WriteResult({ "nInserted" : 1 })
> db.persons.insert({_id:"",name:2})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error index: myTest.persons.$_id_ dup key: { : \"01\" }"
}
})
>
再来看下save操作,直接将_id为01的记录更新了,name由1更新为了2
> db.persons.save({_id:"",name:2})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉杰" }
{ "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafa"), "name" : "test0" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafb"), "name" : "test1" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafc"), "name" : "test2" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafd"), "name" : "test3" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafe"), "name" : "test4" }
{ "_id" : ObjectId("593b489e29b0f45384dfaaff"), "name" : "test5" }
{ "_id" : ObjectId("593b489e29b0f45384dfab00"), "name" : "test6" }
{ "_id" : ObjectId("593b489e29b0f45384dfab01"), "name" : "test7" }
{ "_id" : ObjectId("593b489e29b0f45384dfab02"), "name" : "test8" }
{ "_id" : ObjectId("593b489e29b0f45384dfab03"), "name" : "test9" }
{ "_id" : "", "name" : 2 }
>
Document数据删除
1.删除列表中所有数据
db.[documentName].remove()
集合的本身和索引不会被删除。删除文档是永久性的,不能撤销,也不能恢复的。因此,在执行remove()函数前先用find()命令来查看下是否正确,是个比较好的习惯啦。
> db.persons.remove({})
WriteResult({ "nRemoved" : 13 })
> db.persons.find()
> show collections
persons
system.indexes
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
>
2.根据条件删除
删除集合persons中name等于yujie的记录
remove()函数可以接受一个查询文档作为可选参数来有选择性的删除符合条件的文档
先来插入几条测试记录
> db.persons.insert({name:"yujie"})
WriteResult({ "nInserted" : 1 })
> db.persons.insert({name:"zouqj"})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5329b0f45384dfab04"), "name" : "yujie" }
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
>
再来删除name等于yujie的记录
> db.persons.remove({name:"yujie"})
WriteResult({ "nRemoved" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
>
3.小技巧
如果你想清除一个数据量十分庞大的集合,直接删除该集合并且重新建立索引的办法比直接remove的效率要高很多。
Document数据更新
db.[documentName].update(参数1,参数2,[参数3],[参数4])
- 参数1:查询的条件
- 参数2:更新的字段
- 参数3:如果不存在则插入
- 参数4:是否允许修改多条记录
1.强硬的文档替换式更新操作
db.[documentName].update({查询器},{修改器})
> db.persons.insert({name:"yujie",age:29})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "name" : "yujie", "age" : 29 }
> db.persons.update({name:"yujie"},{age:30})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 }
>
原本我是想把name等于yujie的记录,将其age更新为30,可是会发现虽然age更新为30了,但是也把"name" : "yujie"直接给删除了。因为:强硬的更新会用新的文档替代老的文档,其实就相当于先删除再插入的操作。
2.主键冲突的时候会报错并且停止更新操作
因为是强硬替换,当替换的文档和已有的文档ID冲突的时候,系统会报错。
先来插入几条测试记录
> db.persons.insert({_id:1,name:"test1"})
WriteResult({ "nInserted" : 1 })
> db.persons.insert({_id:2,name:"test2"})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 }
{ "_id" : 1, "name" : "test1" }
{ "_id" : 2, "name" : "test2" }
>
然后我们再来强硬更新,会发现报错了。
> db.personso.update({_id:1},{_id:2,name:"test2"})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.persons.update({_id:1},{_id:2,name:"test2"})
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16837,
"errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 2.0}."
}
})
>
3.insertOrUpdate操作
db.[documentName].update({查询器},{修改器},true)
目的:查询器查出来数据就执行更新操作,查不出来就替换操作。
> db.persons.update({_id:3},{_id:3,name:"test3"},true)
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 3 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 }
{ "_id" : 1, "name" : "test1" }
{ "_id" : 2, "name" : "test2" }
{ "_id" : 3, "name" : "test3" }
>
4.批量更新操作
默认情况下,当查询器查询出多条数据的时候默认就修改第一条数据,如何实现批量修改:
db.[documentName].update({查询器},{修改器},false,true)
5.修改器【通过修改器来完成局部更新操作】
| 修改器名称 | 语法 | 说明 | 示例 |
|---|---|---|---|
| $set | {$set:{field:value}} | 用于指定一个键值对,存在就修改,不存在就添加 | {$set:{name:”Leon”}} |
| $inc | {$inc:{field:value}} | 只适用于数字类型的字段值修改,对指定字段进行增减指定数值 | {$inc:{age:1}} |
| $unset | {$unset:{field:1}} | 删除指定的字段 | {$unset:{age:1}} |
| $push | {$push:{field:value}} | 指定的字段必须是数组,否则中断,指定的字段不存在则创建 | {$push:{family:”brother”}} |
| $pushAll | {$pushAll:{field:array}} | 要求同push,一次添加多个元素到数组 | {$pushAll:{family:[“father”,”mother”,”brother”]}} |
| $addToSet | {$addToSet:{field:value}} | 将值插入匹配元素指定的数组中,如果该值已存在则不添加 | {$addToSet:{family:”sister”} |
| $pop | {$pop:{field:value}} | 从指定字段中数组中删除一个值,value接受正数(最后一个)和负数(第一个),一般使用1和-1 | {$pop:{family:1}} |
| $pull | $pull:{field:value} | 从指定字段中的数组中删除指定的一个值 | {$pull:{family:”father”}} |
| $pullAll | {$pullAll:{field:array}} | 从指定字段中的数组中删除指定的所有值 | {$pullAll:{family:[“father”,”mother”]}} |
| $ | 这是一个定位器非修改器,用于定位数组中的指定键 |
6.$addToSet与$each结合完成批量数组更新
db.persons.update({_id:1},{$addToSet:{books:{$each:{"js","db"]}}})
$each会循环后面的数组把每一个数值进行$addToSet操作
7.存在分配与查询效率
当document被创建的时候DB为其分配内存和预留内存,当修改操作不超过预留内存的时候,则速度
非常快,反之,若超过了就要分配新的内存,从而消耗时间。

另外再推荐一款可视化的神器:Robo 3T
每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解的更多相关文章
- 每篇半小时1天入门MongoDB——2.MongoDB环境变量配置和Shell操作
上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program F ...
- 每篇半小时1天入门MongoDB——1. MongoDB介绍和安装
目录:ASP.NET MVC企业级实战目录 MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据 ...
- 每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作
准备工作 继续连接到mongo C:\Users\zouqi>mongo MongoDB shell version: 3.0.7 connecting to: test 查看数据库和集合 &g ...
- smarty半小时快速上手入门教程
http://www.jb51.net/article/56754.htm http://www.yiibai.com/smarty/smarty_functions.html http://www. ...
- Vue入门系列(五)Vue实例详解与生命周期
Vue官网: https://cn.vuejs.org/v2/guide/forms.html#基础用法 [入门系列] (一) http://www.cnblogs.com/gdsblog/p/78 ...
- mongodb主从以及auth主从 配置详解
1.主服务器配置 #auth = true dbpath = /data/mongodb/db logpath = /data/mongodb/log/mongodb.log port = ...
- Jmeter(十六) - 从入门到精通 - JMeter前置处理器(详解教程)
1.简介 前置处理器是在发出“取样器请求”之前执行一些操作.如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行.前置处理器最常用于在取样器请求运行前修改其设置,或更新未从响应文本中提取 ...
- MongoDB via Dotnet Core数据映射详解
用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事. 一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...
- 第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解
一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按钮).Tool Button(工具按钮).Radio Button(单选按钮).Check Box( ...
随机推荐
- 百度UEditor图片上传或文件上传路径自定义
最近在项目中使用到百度UEditor的图片以及文件上传功能,但在上传的时候路径总是按照预设规则来自动生成,不方便一些特殊文件的维护.于是开始查看文档和源代码,其实操作还是比较简单的,具体如下: 1.百 ...
- Supervisor: A Process Control System
Supervisor: 进程控制系统 概述:Supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序. 它与launch ...
- 蓝桥杯-四平方和-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- linux 内核的各种futex
futex 设计成用户空间快速锁操作,由用户空间实现fastpath,以及内核提供锁竞争排队仲裁服务,由用户空间使用futex系统调用来实现slowpath.futex系统调用提供了三种配对的调用接口 ...
- (知识点)JS中获取元素的样式
首先我们已经知道了JavaScript如果获取一个元素的内部样式,你可以这样做: <div id="box" style="width:100px;height:1 ...
- MySQL自增长的bug?
实验环境: mysql> status--------------mysql Ver 14.14 Distrib 5.7.14, for Linux (x86_64) using EditLin ...
- get和post方式请求数据,jsonp
get方式请求数据: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #289c97 } p.p2 { ma ...
- 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
初次安装git配置用户名和邮箱 初次安装git需要配置用户名和邮箱,否则git会提示:please tell me who you are. 你需要运行命令来配置你的用户名和邮箱: $ git con ...
- php学习之string
1. php str_replace函数: str_replace() 函数使用一个字符串替换字符串中的另一些字符. str_replace(find,replace,string,count) fi ...
- hdu1372 Knight Moves BFS 搜索
简单BFS题目 主要是读懂题意 和中国的象棋中马的走法一样,走日字型,共八个方向 我最初wa在初始化上了....以后多注意... 代码: #include <iostream> #incl ...