MongoDB学习笔记(一)

最近有些时间,就抽空研究了一下MongoDB,我以前经常使用关系型数据库,如Oracle、MySQL,对MongoDB只是有些很肤浅的了解,最近下决心要好好研究一下,主要的参考书有两本:《MongoDB 大数据处理权威指南(第二版)》、《MongoDB权威指南(第一版)》,后者的版本比较旧,但基本还可以用,基本的操作方式基本上差不多。我主要参考的是第一个本书,相对来说,第一本书比较简单,但入门比较容易,还带有PHP和Python的操作MongoDB的指南。

1、安装:MongoDB的安装比较简单,主站是www.mongodb.org,既有32位的版本,也有64位的版本,尽量使用64位的版本。

Windows环境下,可以下载对应的安装包,安装即可

Linux可以下载压缩包,如果使用Ubuntu或者Fedora的话,还可以通过在线档案库下载安装,这样可以安装到最新版本,具体安装内容可以参考https://docs.mongodb.org/manual/administration/install-on-linux/,这是mongoDB的官方文档,如果有什么问题,可以到这里查看一下,比较权威,内容也比较全。

我安装和测试的环境如下

Windows 10 专业版

MongoDB 3.0.6版,安装路径为D:\Program Files\MongoDB

为方便使用mongoDB,将其命令目录加入到环境变量Path里,默认命令保存在D:\Program Files\MongoDB\Server\3.0\bin

2、MongoDB相对于Oracle、Mysql来说,结构上要简单很多,同Oracle一样,其一个实例可以有多个数据库,数据库里面可以任意多个Collection,Collection类似于Oracle中的表概念,但是有本质的不容,Collection中的每一行保存的是键值对,叫Document,这也是mongoDB叫面向文档的数据的一个原因,如果对Json熟悉,理解这个也非常快,键很容易理解,可以理解为表中的列名,但是其值就比较特别了,可以是数组,也可以是键值对,并且Collection中的键非常自由,其下的Documnet可以拥有不同的键,简单来说,Documnet虽然属于一个Collection,但是其键值对是没有限制的,想怎么样,就怎么样。这种存储方式,既有其优势,也有其劣势。

优势:(相对关系型数据库来说)

1)由于存储方式简单,CUID的速度是非常快的,有这么一句话:mongoDB如果查询超过了1秒钟,必然是出了问题

2)同一Collection下的Document之间没什么硬性约束,不同的Collection之间也没有什么约束,所以没有关系型数据库的完整性要求,这一点对于复制、分片是非常重要的。

3)复制、分片相对关系型数据库来说,要容易的多,可以通过横向扩展来提升系统性能。

劣势:(相对于关系型数据库来说)

1)由于没有完整性约束,所以数据的规范性较为困难,需要良好的编程纪律和查错手段来约束

2)缺乏对事务的支持,不适合应用到财务系统

3)缺乏Collection联查功能(也许将来会有),很多关系型数据库需要的操作会很不方便,生成报表需要使用MapReduce才可以。

总之,MongoDB的性能、扩展、复制、分片有独特的优势,所以其不太适合于企业应用程序开发,但是非常适合互联网、云计算相关应用的开发,所以需要选择适合的范围用好它。

3、简单操作

1)启动

从命令行启动mongoDB的命令是mongod,需要指定端口和数据库数据路径,在本机建立了数据库目录d:\mongodb_data\db1,端口为27017

mongod --dbpath d:\mongodb_data\db1 --port 27017

2)连接

mongodDB提供了一个命令行接口mongo,这是一个Javascript的终端,可以通过javascript脚本来操作数据库

D:\>mongo 192.168.1.223:27017
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27017/test
>

(192.168.1.223为本机ip,如果连接远程mongoDB,需要修改IP地址)

3)选择数据库

默认是连接到test数据库,我们创建一个新数据库,如shiyq,如下

> use shiyq

(需要注意,use是切换数据库的命令,如果没有这个数据库,系统会默认创建一个,而且数据库名是区分大小写的,所以用这个命令要细心一点)

> use shiyq
switched to db shiyq
> db
shiyq
> show dbs
local 0.078GB
test 0.078GB
testdb 0.078GB
> show collections;
>

可以看出db命令是显示当前数据库,show dbs是显示本实例中有哪些数据库,因为shiyq是新数据库,没有内容,所以没有显示出来,show collections显示本数据库中的Collection名称,目前还没有,所以没有显示。

4)创建Document

> db.students.insert({name:‘王强‘,code:‘s101-1‘,age:15});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:‘刘欢‘,code:‘s101-2‘,age:18});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:‘赵成‘,code:‘s101-3‘,age:17});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:‘赵成‘,code:‘s101-4‘,age:19});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:‘赵成‘,code:‘s101-5‘,age:19});
WriteResult({ "nInserted" : 1 })

collection名称是students,可以看到collection是不需要创建的,只要创建其下的document就可以了;

> db.students.find()
{ "_id" : ObjectId("560b95bd3bd6389af11ee3d0"), "name" : "王强", "code" : "s101-1", "age" : 15 }
{ "_id" : ObjectId("560b961c3bd6389af11ee3d1"), "name" : "刘欢", "code" : "s101-2", "age" : 18 }
{ "_id" : ObjectId("560b96353bd6389af11ee3d2"), "name" : "赵成", "code" : "s101-3", "age" : 17 }
{ "_id" : ObjectId("560b963c3bd6389af11ee3d3"), "name" : "赵成", "code" : "s101-4", "age" : 19 }
{ "_id" : ObjectId("560b96413bd6389af11ee3d4"), "name" : "赵成", "code" : "s101-5", "age" : 19 }

可以看出已经插入的数据,需要注意每一个Document都有一个_id字段,这个相当于Collection的主键,这个键值也可以手工指定,如果是系统指定,可以保证在复制、分片中没有冲突。

如果使用NodeJS,或者对Javascript比较熟悉,上面的内容也非常容易理解。

5)更新

语法:db.collection.update(criteria,objNew,options)

criteria是过滤条件,objNew是新的内容,options={upsert:true,multi:true},upsert=true,如果存在更新,否则创建,multi=true,如果多条数据符合,则全部更新,默认只更新第一条(需要注意,如果不指定键,无法使用multi=true),需要注意的是这里的objNew会完全替代原始内容,如果要修改单个键值,不能用这个方法。

> db.students.update({name:‘王强‘},{grade:1});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.students.find() );
{ "_id" : ObjectId("560b95bd3bd6389af11ee3d0"), "grade" : 1 }

6)删除:

> db.students.remove({grade:1});
WriteResult({ "nRemoved" : 1 })

其他的操作还有很多,比如

db.collection.save(),有_id更新,没有则新增

$inc 增加值

$set 修改单个键值

$unset 删除键值

$push 向数组键中增加值

$pull  从数组键中删除所有值

$pullAll 从数组中删除多个值

$pop 删除数组中最后一个值

上述$的同一语法为db.collection.update(criteria,{$set:{Author:‘shiyq‘});

时间: 2024-10-18 10:11:05

MongoDB学习笔记(一)的相关文章

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

MongoDB学习笔记一:MongoDB的下载和安装

趁着这几天比较空闲,准备学习一下MongoDB数据库,今天就简单的学习了一些MongoDB的下载和安装,并创建了存储MongoDB的数据仓库.将自己今天学习到的写成博客分享给大家. 一.MongoDB的下载和安装 MongoDB的下载地址为:http://www.mongodb.org/ 1.进入官网的首页后,在首页的右上方单击Downloads连接,如图所示: 2.在页面中可以看到目前最新的版本和以前发布过的版本,这里选择最新版本,windows 32位的进行下载,文件的格式为ZIP格式的,单

MongoDB学习笔记(一:安装时出现The default storage engine 'wiredTiger' is not available问题解决)

今晚在自己老式笔记本来试了一下MongoDB的安装,由于配置比较低,只能选择32位版本的MongoDB进行安装,在安装过程中碰到了上述标题所示错误,自己也捣鼓了一个小时左右,终于在一篇博客中找到答案,具体原文链接如下:http://blog.csdn.net/u013457382/article/details/50775268 MongoDB学习笔记(一:安装时出现The default storage engine 'wiredTiger' is not available问题解决)

Mongodb学习笔记

总结下这几天Mongodb学习笔记 /** * 获取MongoClient * @author xuyw * @email [email protected] * @param host * @param port * @return */ public static MongoClient getMongoClient(String host, int... port) { MongoClient mongoClient = null; int portlen = 0; try { if (p

[Spring Data MongoDB]学习笔记--建立数据库的连接

1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoDbFactory { DB getDb() throws DataAccessException; DB getDb(String dbName) throws DataAccessException; } 然后我们可以继续用MongoDbFactory来创建MongoTemplate的实例. pu

mongodb学习笔记系列一

一.简介和安装 ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017 mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,--smallfiles 二.基本命令 1.登录mongodb client /use/local/mongo 2.查看当前数据库 show databases; show dbs; 两个可能 3.admin是和管理有关的库,local 是放schema有关

[Spring Data MongoDB]学习笔记--牛逼的MongoTemplate

MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面. 注:MongoTemplate是线程安全的. MongoTemplate实现了interface MongoOperations,一般推荐使用MongoOperations来进行相关的操作. MongoOperations mongoOps = new MongoTemplate(new SimpleMongoDbFactory(new Mongo(), "database")); MongoDB docu

[Spring Data MongoDB]学习笔记--注册一个Mongo实例

1. 通过Java based bean metadata @Configuration public class AppConfig { public @Bean Mongo mongo() throws UnknownHostExceptioin { return new Mongo("localhost"); } } 上面的方式包含异常处理,这并不是我们想要的. 所以,应该尽量用下面这种方式MongoFactoryBean,或者后面的xml方式. @Configuration p

MongoDB 学习笔记(二) 之查询

最简单的查询 个人认为mongoDB是面向对象的吧. 例如最简单的查询  整个数据集只有三条数据 第一查询姓名为张三的  数据 查询的条件比较好写 随意   db.collection.find(查询条件)   例如 15 得到的结果是这样 如果你不想返回某个字段呢 ,你可以自己定义返回的字段值 语法这样 db.collection.find({查询条件},{返回字段}) 16 我们看到每次查询 "_id" 这个字段 都返回  我们可以将它设置为0 这样的话就不会返回 如 查询条件里的

mongodb 学习笔记 02 -- CURD操作

mongodb 学习笔记 02 – CURD操作 CURD代表创建(Create).更新(Update).读取(Read)和删除(Delete)操作 创建库 直接 use 库名 然后创建collection 就可以创建库 创建collecion db.createCollection("collectionName") 隐式创建collection db.collectionName.insert({xxxxxx}) 删除collection db.collectionName.dro