`

MongoDB初体验

阅读更多
昨天到今天,初步研究了一下MongoDB,主要是对照着这个系列文章自己实践了一遍:
http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html

本文把这2天学到简要总结一下,按照自己的理解打乱了顺序。明天开始花2天时间通读一遍官方reference,再研究一下是否有方案能解决事务的问题,再找找有没有运维和可靠性方面的最佳实践

0、理解

感觉使用MongoDB的好处是:

性能较好,插入10万条数据只用了3秒钟;创建索引后的查询效率也很高
无schema,因此要增删字段都很容易,更容易实现一些对灵活性要求高的需求
很容易做复杂查询
内建的对master-slave和sharding的支持,使得做读写分离、分片都比较简单

缺点:

似乎不能回滚,误操作了怎么办?比如db.person.remove(),只能靠定期备份吗
好像也没有事务,怎么保证数据一致性?

1、基本概念

MongoDB里首先是分db,然后每个db下有collections,collection下保存文档

可以跟RDBMS对比一下,db的概念差不多,都是数据库实例;collections类似于table,但是没有schema;文档就是table里的一行记录

默认用mongo ip:port命令,会连上test db;如果用mongo ip:port/admin,则是连上admin db

用show dbs命令可以看到当前有哪些db。mongo的客户端同时也是一个javascript的执行环境,所以各db同时也是一个js object;用use [dbname]命令,可以切换db

创建db和创建collection,都不需要额外的命令(比如create table之类的),直接插入文档,就会生成db和collection,这点比较方便

mongod是server端的进程,mongos是做sharding时的server端进程;mongo是client,也是一个js执行环境。如果编程连接MongoDB,则driver就视为client

2、第一印象

第一次尝试这个命令
db.person.insert({name:"kyfxbl",age:29})

会觉得有点奇怪,不过只要理解了db.person是一个js object,insert是其上的一个方法,就很好理解了。事实上,如果输入db.person.insert,还会输出这个函数体。所以也可以这样
var single = {name:"kyfxbl",age:29} 
db.person.insert(single) 

值得一提的是,MongoDB用的是bson,跟json基本上是一回事,只是数据类型更多一点

3、条件查询

// where age = 20 
db.person.find({"age":20})


// where age > 20 
db.person.find({"age":{$gt:20}}) 


// where age >= 20 
db.person.find({"age":{$gte:20}}) 


// where age > 20 and favourite = "dota" 
db.person.find({"age":{$gt:20},"favourite":"dota"}) 


// where age < 20 or favourite = "dota" 
db.person.find({$or:[{"age":{$lt:20}},{"favourite":"dota"}]}) 


// where name in "zhengshengdong","kyfxbl" 
db.person.find({"name":{$in:["zhengshengdong","kyfxbl"]}}) 


// where name not in "zhengshengdong","kyfxbl" 
db.person.find({"name":{$nin:["zhengshengdong","kyfxbl"]}}) 


// find name startwith 'k' and endwith 'l' 
db.person.find({"name":/^k/,"name":/l$/}) 


// custom query function 
db.person.find({$where:function(){return this.age > 20}}) 
db.person.find({$where:function(){return this.name == "kyfxbl"}}) 

其中,$where绝对是个大招啊,非常强力。不过因为是大招,所以CD也长,不能随便乱放

4、update

// 更新的错误方法,这行记录会只剩下"age":20 
db.person.update({"name":"zhengshengdong"},{"age":20}) 


// 正确方法 
var condition = {"name":"zhengshengdong"} 
var model = db.person.findOne(condition) 
model.age = 20 
db.person.update(condition,model) 


// $inc和$set 
db.person.update({"name":"def"},{$inc:{"age":17}}) 
db.person.update({"name":"def"},{$set:{"age":23}}) 


// upsert 
db.person.update({"name":"liting"},{"age":100},true) 


// batch update 
db.person.update(condition,{$set:{"age":99}},false,true) 


5、聚合和游标

// group 
db.person.group({ 
key:{age:true}, 
initial:{}, 
reduce:function(cur,prev){}, 
finalize:function(out){}, 
condition:{} 
})


// cursor 
db.person.find().limit(2) 


6、索引

// 索引可以有效提升查询效率 
db.person.find({name:"zsd10000",age:10000}).explain() 
{ 
        "cursor" : "BasicCursor", 
        "isMultiKey" : false, 
        "n" : 1, 
        "nscannedObjects" : 100000, 
        "nscanned" : 100000, 
        "nscannedObjectsAllPlans" : 100000, 
        "nscannedAllPlans" : 100000, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 54, 
        "indexBounds" : { 

        }, 
        "server" : "SZXY3Z001739121:27017" 
} 


db.person.find({name:"zsd10000",age:10000}).explain() 
{ 
        "cursor" : "BtreeCursor name_1", 
        "isMultiKey" : false, 
        "n" : 1, 
        "nscannedObjects" : 1, 
        "nscanned" : 1, 
        "nscannedObjectsAllPlans" : 2, 
        "nscannedAllPlans" : 2, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 34, 
        "indexBounds" : { 
                "name" : [ 
                        [ 
                                "zsd10000", 
                                "zsd10000" 
                        ] 
                ] 
        }, 
        "server" : "SZXY3Z001739121:27017" 
} 


7、cluster

// 集群(主从集群和副本集)
mongod --dbpath=xxxx --master
mongod --dbpath=xxxx --port=8888 --slave --source=127.0.0.1:27017

mongo localhost:27017

db.person.insert({name:"yangliting",age:27})
not master

master负责写入,slave负责读取,不允许写入。slave从master定期同步文档和索引等

8、sharding

//mongo sharding
mongod --dbpath=..\db --port 2222
mongos --port 3333 --configdb=localhost:2222
mongod --dbpath=..\db --port 4444
mongod --dbpath=..\db --port 5555

mongo localhost:3333/admin
db.runCommand({addshard:"localhost:4444",allowLocal:true})
db.runCommand({addshard:"localhost:5555",allowLocal:true})
db.runCommand({enablesharding:"test"})
db.runCommand({shardcollection:"test.person",key:{name:1}}) // 自动在key上创建索引

use test
db.person.insert()
db.printShardingStatus()
分享到:
评论

相关推荐

    mongodb初体验

    mongodb初体验,mongodb初体验,mongodb初体验,mongodb初体验

    关于node.js初体验. 如何搭建并完成一个简单的后台, 配合mongodb数据库, 实现信息的增删改查功能

    关于node.js初体验. 如何搭建并完成一个简单的后台, 配合mongodb数据库, 实现信息的增删改查功能2

    头歌springboot初体验

    在"头歌springboot初体验"中,我们可以探讨以下几个关键知识点: 1. **起步依赖(Starter Dependencies)**:Spring Boot通过起步依赖管理项目中的依赖。例如,如果你想使用Spring MVC进行Web开发,只需添加`spring...

    Web基础——WebApp之初体验(三)

    在本篇关于“Web基础——WebApp之初体验(三)”的文章中,我们将深入探讨Web应用程序(WebApp)的关键概念和技术,以及它们如何为用户提供便捷的在线体验。WebApp是互联网技术的重要组成部分,它们允许用户在浏览器...

    feapder 爬虫框架初体验代码

    在这个"feapder爬虫框架初体验代码"中,我们将深入探讨Feapder的核心特性和基本用法。 1. **Feapder简介** Feapder是一个轻量级的爬虫框架,它提供了丰富的内置功能,如自动处理反爬策略、数据持久化、任务调度等...

    Zula-online-shopping:基于Mongodb,NodeJS和Express的项目

    【标题】"Zula在线购物"是一个利用现代Web技术构建的电子商务平台,它结合了Mongodb作为数据库系统,NodeJS作为后端服务器平台,以及Express作为应用框架。这个项目展示了如何将这些技术融合在一起,创建一个功能...

    egg-admin-back:egg-admin后台管理系统后端,基于eggjs+mongodb

    4. **错误处理**:统一的错误处理机制,确保生产环境的稳定性和用户体验。 5. **日志记录**:记录操作日志,便于追踪和分析系统运行情况。 **开发流程** 1. **初始化项目**:使用Egg.js CLI创建项目,并配置MongoDB...

    nosql 入门教程

    第2章 NoSQL上手初体验 17 2.1 第一印象——两个简单的例子 17 2.1.1 简单的位置偏好数据集 17 2.1.2 存储汽车品牌和型号数据 22 2.2 使用多种语言 30 2.2.1 MongoDB驱动 30 2.2.2 初识Thrift 33 2.3 小结 ...

    电子商务网站建设课程设计报告

    1. 大纲规划:在设计电子商务网站之初,应先拟定一个详细的设计大纲。这包括需求分析、功能模块划分、技术选型、设计流程和时间安排等。需求分析是明确网站需要实现的目标和功能的基础,功能模块划分则是将整体目标...

    绿色的生活服务平台购物商城模板html源码(购物车数字可变,金额不变).zip

    数据库(如MySQL或MongoDB)也是必不可少的,用于存储商品信息、用户数据和订单详情。 此外,考虑到SEO(搜索引擎优化),模板应包含元标签、关键词和描述,以帮助搜索引擎理解和索引网站内容。同时,确保网站的...

    kaixinnongchang.rar_social_农场

    开心农场在设计之初,就面临着如何实现用户之间的实时交互问题。这需要强大的服务器支持,以处理大量并发的请求,确保玩家能在同一时间看到彼此的动作,如种植作物、偷取朋友的果实等。这就涉及到分布式系统设计,...

    带聊天室网络版的五子棋

    此项目旨在提供一个娱乐与社交相结合的平台,虽然功能可能尚未完备,但其核心特性已经初具雏形。 【描述】:“带有聊天功能的五子棋”意味着这款游戏不仅实现了基本的五子棋游戏逻辑,还增加了在线聊天室功能。这...

    fullwardrobe_nodejs

    - 引入前端框架(如React或Vue.js)实现单页应用,提升用户体验。 这个项目对于初学者和经验丰富的开发者都是一个很好的学习资源,通过它,你可以深入了解这些技术的结合使用,以及如何构建一个完整的Web应用。同时...

    计算机毕业设计-学生毕业设计-pan

    《计算机毕业设计-学生毕业设计-pan》是一个以Java为主要编程语言的项目,适用于软件开发人员,无论是初入职场还是在校学生,都能从中受益。这个项目不仅提供了丰富的学习材料,而且还是一个理想的实践平台,帮助...

    ThinkPHP3.2.3完全开发手册

    - **MongoDB支持增强**:对于MongoDB的支持更加完善,提供了更多的特性和API,便于开发者进行NoSQL数据库的操作。 - **模型类增强**:模型类新增了许多有用的功能,比如支持复合主键、多表操作等,极大地丰富了数据...

Global site tag (gtag.js) - Google Analytics