昨天到今天,初步研究了一下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初体验
关于node.js初体验. 如何搭建并完成一个简单的后台, 配合mongodb数据库, 实现信息的增删改查功能2
在"头歌springboot初体验"中,我们可以探讨以下几个关键知识点: 1. **起步依赖(Starter Dependencies)**:Spring Boot通过起步依赖管理项目中的依赖。例如,如果你想使用Spring MVC进行Web开发,只需添加`spring...
在本篇关于“Web基础——WebApp之初体验(三)”的文章中,我们将深入探讨Web应用程序(WebApp)的关键概念和技术,以及它们如何为用户提供便捷的在线体验。WebApp是互联网技术的重要组成部分,它们允许用户在浏览器...
在这个"feapder爬虫框架初体验代码"中,我们将深入探讨Feapder的核心特性和基本用法。 1. **Feapder简介** Feapder是一个轻量级的爬虫框架,它提供了丰富的内置功能,如自动处理反爬策略、数据持久化、任务调度等...
【标题】"Zula在线购物"是一个利用现代Web技术构建的电子商务平台,它结合了Mongodb作为数据库系统,NodeJS作为后端服务器平台,以及Express作为应用框架。这个项目展示了如何将这些技术融合在一起,创建一个功能...
4. **错误处理**:统一的错误处理机制,确保生产环境的稳定性和用户体验。 5. **日志记录**:记录操作日志,便于追踪和分析系统运行情况。 **开发流程** 1. **初始化项目**:使用Egg.js CLI创建项目,并配置MongoDB...
第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. 大纲规划:在设计电子商务网站之初,应先拟定一个详细的设计大纲。这包括需求分析、功能模块划分、技术选型、设计流程和时间安排等。需求分析是明确网站需要实现的目标和功能的基础,功能模块划分则是将整体目标...
数据库(如MySQL或MongoDB)也是必不可少的,用于存储商品信息、用户数据和订单详情。 此外,考虑到SEO(搜索引擎优化),模板应包含元标签、关键词和描述,以帮助搜索引擎理解和索引网站内容。同时,确保网站的...
开心农场在设计之初,就面临着如何实现用户之间的实时交互问题。这需要强大的服务器支持,以处理大量并发的请求,确保玩家能在同一时间看到彼此的动作,如种植作物、偷取朋友的果实等。这就涉及到分布式系统设计,...
此项目旨在提供一个娱乐与社交相结合的平台,虽然功能可能尚未完备,但其核心特性已经初具雏形。 【描述】:“带有聊天功能的五子棋”意味着这款游戏不仅实现了基本的五子棋游戏逻辑,还增加了在线聊天室功能。这...
- 引入前端框架(如React或Vue.js)实现单页应用,提升用户体验。 这个项目对于初学者和经验丰富的开发者都是一个很好的学习资源,通过它,你可以深入了解这些技术的结合使用,以及如何构建一个完整的Web应用。同时...
《计算机毕业设计-学生毕业设计-pan》是一个以Java为主要编程语言的项目,适用于软件开发人员,无论是初入职场还是在校学生,都能从中受益。这个项目不仅提供了丰富的学习材料,而且还是一个理想的实践平台,帮助...
- **MongoDB支持增强**:对于MongoDB的支持更加完善,提供了更多的特性和API,便于开发者进行NoSQL数据库的操作。 - **模型类增强**:模型类新增了许多有用的功能,比如支持复合主键、多表操作等,极大地丰富了数据...