MongoDB入门三步曲1--安装、基本操作
mongodb 基本操作
目录
mongodb安装
下载tgz文件,直接tar -zxv -f 解压,放到/usr/local目录下,这个可以根据需要决定目录位置。
然后再单独设置个数据及日志目录,例如:/var/mongodb,这个也根据需要自己设置。
之所以把安装目录和数据目录,是为了保持各自的清晰性。因为使用同一个mongodb可以启动多个mongod实例,而这不同的实例需要对应不同的数据空间,因此分开存放还是有好处的。
mongod启动
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb/data --logpath=/var/mongodb/logs/log.log -fork
通过此命令即可启动一个mongod实例,即mongo db的服务实例,启动参数简单说明一下:
- sudo -u mongodb 这个是为了权限清晰,单独为mongodb设置了一个用户及用户组,然后mongdb的运行都是基于此用户完成;
- /usr/local/mongodb/bin/mongod 这个是真实的启动命令,即启动mongod服务
- --dbpath及--logpath 指定数据目录及日志目录
- -fork 让服务程序后台运行
- --port 还可以使用--port指定服务端口号,不指定时默认使用27017端口
mongo shell启动
在安装mongodb的时候,除了安装mongod服务外,还提供了一个shell操作接口,通过如下命令启动mongo shell
sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27017
mongo shell后面的主机及端口号不是必须的,如果不指定即使用默认的地址:127.0.0.1:27017
启动mongo shell后,默认进入的是test库,可以使用use admin,切换到admin数据库中。
mongod 停止
在mongo shell中,切换到admin库后,使用如下命令即关闭mongod服务。
use admin
db.shutdownServer()
关闭完mongod服务后,mongo shell即会与服务失去连接,使用bye即可退出mongo shell。
mongodb基本操作:CRUD
数据插入
C即数据创建,在mongodb中,使用db.collection.insert()即可,collection为集合名。
以下的操作,都假设在test空间下完成,使用use test切换。
如下命令往blog集合中添加一条记录:
db.blog.insert({"title":"mongodb test", "content":"this is the first mongodb insert test!"})
mongodb使用BSON(JSON扩展)格式的数据存储,在集合中,对数据记录没有特定模式的要求,虽然在上面的记录中有两个key: title和content,但下面的命令同样可以向blog集合中插入数据:
db.blog.insert({"msg":"this is a error msg"})
在mongodb中无须显示创建集合,在插入数据时,如果没有此集合会自动创建,如上面的blog集合。
另外mongodb尚未提供原生的批量插入,但可以通过脚本完成批量。
for(var i = 0; i < 100; i++) {
db.blog.insert({"title":"mongodb" + i, "content":"content" + i});
}
数据查询
R即数据查询,在mongo shell中,有三种查询操作:
- db.collection.find():基本的查询操作,会返回所有满足条件的结果
- db.collection.findOne():基本的查询操作,只返回满足条件的第一条结果
- db.collection.findAndModify():查询并更新操作,在后面的更新操作中讲解
在查询中需要指定查询条件,其中的查询条件即是以json表示的key-value对,如下:
db.person.find({"name":"enjiex"})
想必你已经知道如何插入数据,所以这里直接执行查询了。上面这条记录会把name="enjiex"的所有记录都查询出来。
除了这种基本的相等查询外,mongodb也支持数据比较及逻辑判断操作:
比较操作符:$gt,$gte,$lt,$lte,$ne
db.person.find({"age":{$gt:20}})
与或运算符:$or
与操作没有专门的操作符,只需要把多个查询条件在json中以","隔开即可:
db.person.find({"name":"enjiex", "age":20})
或操作
db.person.find({$or:[{"name":"enjiex"}, {"age":20}]})
包含操作:$in, $nin
db.person.find({"name":{$in:["enjiex", "mc"]}})
除了上面几个操作外,mongodb还提供了$where操作符用于完成复杂的数据查询
db.person.find({$where:function(){return this.name=="enjiex"}})
可以看出,$where操作符后面跟着一个返回boolean类型的方法定义。在这个方法中可以完成复杂的条件判断,并最后返回boolean值,mongodb就会把集合中满足方法中定义的条件的结果返回。
上面的查询条件对于find()和findOne()都是适用的。
数据更新
U即数据更新,在mongodb中提供了多种数据更新手段:
- 替换更新:db.person.update(condition, model)
- 更新插入:db.person.update(condition, model, true)
- 批量更新:db.person.update(condition, model, true, true)
- $inc和$set更新: db.person.update(condition, {$set:{"name":"enjiex"}})
默认情况下,mongodb 默认情况下将会把更新的内容替换掉第一条满足条件的记录。假如我们有条记录{"name":"enjiex", "age":20},执行完如下命令,此条记录就变成{"name":"mc"},也就是说满足条件的记录被替换掉了。
db.person.update({"name":"enjiex"}, {"name":"mc"})
这在很多情况下并非是我们想要的结果,也许我们只想把name由"enjiex"变为"mc",但同时保留"age":20,怎么做呢,使用"$set"啊。如下:
db.person.update({"name":"enjiex"}, {$set:{"name":"mc"}})
这样就ok了。
有些场景,如果数据库集合中没有此记录,我们可能想把此记录插入到集合中,在mongodb中也可以完成,只要在update方法指定第三个参数为true。如下:
db.person.update({"name":"csdn"}, {$set: {"name":"mc"}}, true)
操作完成后,查看数据集合就会发现多了一条{"name":"mc"}的记录。
那上面的操作都只对第一条满足条件的记录做更新,假如集合中有多条数据需要修改呢,只需要给update指定第四个参数为true即可。
上面的第三个参数和第四个参数,默认为false,并且对于替换更新和$set更新都有效。
数据删除
D对应于数据删除,在mongodb中,删除也很简单,即db.collection.remove(condition),如果想删除上面插入的name="csdn"的数据,执行如下命令即可:
db.person.remove({"name":"csdn"})
且记如果不给remove指定参数,mongodb会删除集合中的所有数据,一定谨慎使用。
集合删除
除了上面的操作外,我们还需要删除不再需要的集合,很简单,一个drop命令即可完成:
db.person.drop()
MongoDB入门三步曲1--安装、基本操作的更多相关文章
- MongoDB入门三步曲2--基本操作(续)--聚合、索引、游标及mapReduce
mongodb 基本操作(续)--聚合.索引.游标及mapReduce 目录 聚合操作 MapReduce 游标 索引 聚合操作 像大多关系数据库一样,Mongodb也提供了聚合操作,这里仅列取常见到 ...
- MongoDB入门三步曲3--部署技术:主备、副本集和数据分片
mongodb部署--主备.副本及数据分片 主备复制 副本集 数据分片 主备复制 主备复制是最基本的一种多点部署方案,在读写分离.热备份.数据恢复等方面具有重要作用. 在真实的生产环境,主备库肯定需要 ...
- Composer三步曲:安装、使用、发布
转载地址:https://segmentfault.com/a/1190000011858458 原文是在我自己博客中,小伙伴也可以点阅读原文进行跳转查看,还有好听的背景音乐噢~ 在现代化的PHP开发 ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
- [转]Membership三步曲之入门篇 - Membership基础示例
本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例 Members ...
- ASP.NET 安全系列 Membership三步曲之入门篇 - Jesse Liu
Membership 三步曲 ASP.NET 安全系列 Membership三步曲之入门篇 ASP.NET 安全系列 Membership三步曲之进阶篇 ASP.NET 安全系列 Membership ...
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...
- OpenGL ES2.0编程三步曲 -转
原地址:http://blog.csdn.net/myarrow/article/details/7707943 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. typedef st ...
- 第七章 new的三步曲
这章是本系列文章的重点,这章揭示了js对象的真正本质 看下面的事例 var a = new b(); 等价于 ①var a={}; ②a.__proto__=b.prototype; ③b.call( ...
随机推荐
- iOS开发:AVPlayer实现流音频边播边存
1. AVPlayer简介 AVPlayer存在于AVFoundation中,可以播放视频和音频,可以理解为一个随身听 AVPlayer的关联类: AVAsset:一个抽象类,不能直接使用,代表一个要 ...
- 5分钟 搞定UIButton的文本与图片的布局
UIButton内部文本和图片的布局是我们日常代码中,不可缺少的部分,按钮默认左边图片右边文本,那要实现左边文本,右边图片,我们该怎么解决呢,上面图片,下面文本又该怎么办呢 其实很简单,今天总结下,目 ...
- mysqldump原理2
本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump的一些差异,为备份方式的选择提供更多的帮助. 首先来看下 mysqldump 的几个主要参数的实际 ...
- [原创]javascript prototype 对象 函数 <精简的美丽......>
精简的美丽...... javascript prototype 对象 函数 在javascript中我们都知道创建一个对象使用如下代码var x = {}对象可以拥有属性和方法var x = { ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- 常见android手机分辨率(xxhdpi,xhdpi)
手机常见分辨率: 4:3 VGA 640*480 (Video Graphics Array) QVGA 320*240 (Quarter VGA) HVGA 480*320 (Half-size V ...
- android 开源 OCR 项目 及手写识别
http://blog.csdn.net/archfree/article/details/6023676 1)一个为Android平台,将识别由手机的相机拍摄的图像文本应用程序. http://co ...
- 如何在C#中循环一个枚举
在C#中要想迭代循环一个枚举,最容易想到的办法是直接进行循环,如下代码所示: public enum Suit { Spades, Hearts, Clubs, Diamonds } publ ...
- Ant构建和部署项目(转)
原文地址: http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html Ant是一个Apache基金会下的跨平台的构件工具,它可以实 ...
- 关于SWT的线程问题
大部分情况下,GUI界面编程是不用考虑线程问题的,SWT已经帮助我们隐藏了底层的线程调用. 但是一些特殊应用的实现,却不得不涉及SWT线程编程.比如说当进度条的例子(以后要加上,现在还没有做,没有总结 ...