MongoDB + node-mongoskin简单演示样例
特点
无模式
MongoDB 中的每一条文档,都是一个 JSON 对象,因此你无需提前定义一个集合的结构,集合中的每一个文档也能够有不同的结构。
异步写入
MongoDB 默认全部的写操作都是『不安全』的,即当请求被 MongoDB 收到时,不等写入操作完毕,就返回一个『成功』的响应。 这是默认的行为,当然你也能够设置一些选项,让操作等待等待写入完毕后再返回响应。只是对于大多数应用,这样的『不安全』已经足够安全了。
简单查询
MongoDB 仅仅支持简单的查询,MongoDB 仅仅储存数据,很多其它的逻辑应该在应用中解决。因此 MongoDB 有着简单的且在各编程语言下高度一致的 API 接口。
无需运维
MongoDB 差点儿没有什么选项能够设置,集群也是设置一次之后就能够自己主动地解决故障,极少须要维护。
安装和备份
执行 mongod 启动数据库,执行 mongo 启动client Shell,。
MongoDB 被设计执行于 64bit 的操作系统,在 32bit 的情况下,数据文件最大限制为 2G.
MongoDB 在执行时并不会实时地将改动写入磁盘,因此在关闭server时须要给 MongoDB 时间将全部数据写入磁盘。当出现server突然掉电的情况时,MongoDB 的数据库文件会损坏,须要进行修复才干又一次执行,这个过程中会丢失掉电时正在进行的写入操作。在对执行中的 MongoDB 进行备份时,须要使用自带的 mongodump 工具,不能直接复制其数据库文件。
设计文档结构
ObjectID
MongoDB 会为每个文档默认加入一个名为 _id, 类型为 ObjectId的字段,这个字段用来唯一地标识每个文档。这个 ID 通过时间,server,进程号被生成,甚至能够觉得是全世界唯一的。
除了 MongoDB 默觉得 _id 加入 ObjectID, 你也能够自己在文档中创建 ObjectID, 来起到唯一地标识某个对象的功能。
查询和更新
所谓『增删查改』在 MongoDB 里相应:
find/findOne: 查询
update/save: 改动
insert/save: 新增
remove: 删除
在 MongoDB 中,操作符以 $ 开头,主要分为三类:查询操作符,更新操作符,聚合查询操作符。
查询操作符
用于 find 和 update 中的查询器,如 $gt(大于), $ne(不等于), $in(匹配几个值之中的一个), 逻辑运算:$and, $not。
更新操作符
用于 update 中的更新器,如 $inc(对数字进行增量), $set(改动文档的一部分), $unset(删除一个字段).
MongoDB 对嵌入式的文档和数组有很好的支持:$addToSet(向集合中加入元素), $push(向数组加入元素), $pull(从数组移除元素).
聚合查询(Aggregation)
类似于 SQL 数据库中的 GROUP, 提供统计和计算的功能,要多强大有多强大,毕竟能够直接在数据库中执行 JavaScript 代码,只是由于性能的关系,不适合在应用中频繁调用。
查询命令还有几个选项
limit: 限制返回的结果数
skip: 跳过一些结果
sort: 对结果进行排序
fields: 仅仅返回指定的字段
MongoDB能够方便的把一些本来MySQL须要通过一对多关系关联的数据通过数组+对象的方式作为一个文档存储到一个Collections里面,而且提供了各种API支持对一个文档里面的数组进行操作。
MongoDB经常使用查询方法与在node中的体现:
1、数据库连接
MongoDB:mongo -u username -p password host:port/dbs
Node+MongoSkin: require(“mongoskin”).db(username:password@host:port/dbs);
2、索引
person.ensureIndex({“name”:1},{“unique”:true}, callback);
第一个參数是selector,第二个參数是选项,有unique(唯一索引)等mongoDB索引选项。
ensureIndex先查找是否存在这个索引,假设不存在,则建立索引,因此不会出现反复建立的情况。
3、新建/添加数据
person.save({“name”:”jobs”, age:32, gender:”male”}, callback);
person.save({“name”:”tim”, age:29, gender:”male”}, callback);
db.集合名.insert({name:'xiaoxiao',age:2},function(error,result){});
4、查询
findOne方法:查询符合selector条件的结果,取第一条给callBack,err是错误信息,假设没有错误,则为undefined,data数据为一个JS对象。
person.findOne({“name“:”jobs”}), callBack(err, data));
find方法:查询符合selector条件,而且还能够增加一系列參数,最后通过toArray方法,把数据生成数组的方式传递给callback。
person.find({“gender”:”male”},{sort:[['name', 1]],skip:pageNum*(page-1), limit:pageNum}).toArray(callback(err, data){}) ;
同一时候查询的时候能够通过$in,$gt,$lt等方式来确定selector的范围。
$ne:不等于;
personCollection.find({age:{$ne:'2'}},function(error,result){}
$in:某值是否在此指定的范围,后面一般指定一个范围数组,数组里面值的类型能够不同样;
personCollection.find({age:{$in:['2','3','4','5']}},function(error,result){}
$nin:表示不在某个数组范围里;
personCollection.find({age:{$lte:'3'}},function(error,result){}
$lt,、$lte、$gt、$gte:分别代表 <, <=,>, >=,它们是用来设置查询范围;
$or:也是指定一个范围来使用,但与上面最大的区别在于,$in 、$nin 有且仅仅有一个数组范围,而 $or 则能够是多个数组范围内满足条件;
personCollection.find({$or:[{name:'王二小'},{age:'2'}]},function(error,result){}
5、更新
有两点要注意:
[1]、update方法假设是要更新文档中的一个或几个属性的时候,必需要用形如{$set:{age:33}}的形式,假设写成{age:33}的形式,则这个文档的其它内容都会被删除,仅仅剩{age:32}这一个属性。
[2]、update方法默认是仅仅更新找到的第一个文档,假设须要全部的文档都更新,则须要在option部分再加上{multi:true},假设想要在查找不到这条记录的时候新增一条,则要在option部分加上{upset:true}。
person.update({“name”:”jobs”}, {$set{“age”:33}}, {multi:true}, callback(err))
[3]、$inc按步长添加,比方给 age 字段添加1。
personCollection.findAndModify({_id:'1111111'},[],{$inc:{age:1}},{new:true,upset:true},function(error,result){}
6、删除
person.remove({“name”:”jobs”},callback(err){});
7、selector中使用MongoDB自己主动生成的_id
MongoDB会为每个文档生成一个_id属性,类似于MySQL的主键,是唯一的。_id的类型是mongoDB自定义的ObjectId类型,因此虽然在查询的时候能够得到一个12位或者24位的_id字符串,可是假设想在selector里面通过_id进行查找或其它操作的时候,必需要先通过db.collection.id()方法进行类型转换。
person.remove({“_id”:person.id(stringID)}, callback(err){});
8、mongoDB对文档内的数组进行操作(通过update方法)
[1]、通过$addToSet方法向数组中插入记录,插入前该方法会先查找是否存在这条记录,假设存在则不插入;假设想要插入反复的值,则能够通过$push进行加入。
person.update({“name”:”jobs”}, {$addToSet: {
company: {
name: “google”,
address: USA,
workingTime: 3
}
}, function(err){});
[2]、改动数组中的数据:通过$符。假设在数组中查询的时候要匹配两个属性,必需要使用$elemMatch方法,假设仅仅通过{"name":”google”, "address":USA}去查找,会选择到全部name为google或者address为USA的元素。在定位到这个元素之后,通过$来选定它进行改动。
person.update({
“name”:”jobs”,
company:{$elemMatch:{"name":”google”, "address":USA}}
}, {$set:{"company.$.workingTime":4}},function(){})
[3]、删除数组中指定的数据:通过$pull方法
person.update({
“name”:”jobs”,
},{$pull:{company:{“name”:”google”, “address”:”USA”}}},function(err){})
$pop:删除数组头部或者尾部一个值, {$pop:{filed:-1}} 从头删除, {$pop:{filed:1}} 从尾部删除。
personCollection.findAndModify({_id:'1111111'},[],{$pop:{tag:-1}},{new:true,upset:true},function(error,result){}
更新
2014年07月19日15:11:23
參考资料
http://jysperm.me/technology/1575
http://www.cppblog.com/dead-horse/archive/2011/09/23/156617.html
https://github.com/kissjs/node-mongoskin
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名 | Creative
Commons BY-NC-ND 3.0
- 最后改动时间:2014年07月19日 15:12
MongoDB + node-mongoskin简单演示样例的更多相关文章
- Thrift的安装和简单演示样例
本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例.对于具体的解说,后面在进行阐述. Thrift简述 ...
- Introspector(内省)简单演示样例 与 简单应用
简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...
- JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例
什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...
- [hadoop系列]Pig的安装和简单演示样例
inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...
- 一则简单演示样例看Oracle的“无私”健壮性
Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...
- Android通过startService播放背景音乐简单演示样例
关于startService的基本使用概述及其生命周期可參见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单演示样例,演示sta ...
- 百度地图 Android SDK - 检索功能使用的简单演示样例
百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...
- MyBatis对数据库的增删改查操作,简单演示样例
之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...
- [Android]RecyclerView的简单演示样例
去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...
- 虚幻4Matinee功能 基本概念及简单演示样例(Sequence编辑器)
虚幻4提供的Matinee功能十分强大,能够用来制作动画.录制视频. 它的核心想法是在Matinee编辑器内提供一套自己的时间坐标系,在这个相对时间内通过调节actor的属性来改变actor的状态,进 ...
随机推荐
- zzulioj--1827--石锅全拌(区间求和水题)
1827: 石锅全拌 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 6 Solved: 3 SubmitStatusWeb Board Descri ...
- App server 与 Web server之间的区别
原文: http://www.javaworld.com/javaqa/2002-08/01-qa-0823-appvswebserver.html 简单来说,web服务器提供页面给浏览器,而app服 ...
- 如何安装MySQL?(二)
MYSQL的两种安装方式 MSI安装 ZIP安装 第一步: 第二步: 第三步: 这里我选择下载到桌面吧! 第四步: 第五步: 第六步: 第七步: 典型安装:除了安装MySQL的服务器,还安装MySQL ...
- Android项目实战(五十六):获取WebView加载的url的请求错误码
例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新 ...
- Spring控制反转容器的使用例子
详细代码如下: spring-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- CentOS6.8下完全干净卸载mysql
来源整理于 https://www.cnblogs.com/wanghuaijun/p/6398240.html 虚拟机CentOS6.8下 先执行命令查看目录是否存在mysql 文件夹: cd ...
- 位运算与bitset
&运算 将两个数转化为二进制后,对应的位置上相同即取,通常取1,所以&通常情况下可以用来枚举子集 设x为表示集合的整数,那么这个整数有如下性质: x的子集整数y在数值上不会比x大.因 ...
- POJ2104 K-th Number(线段树,二分,vector)
题意 不带修改区间第k小.(n<=100000) 题解 建立线段数和vector数组(vector为当前区间排列之后的序列)(归并) 然后对于每一个询问二分答案. 问题就转化为区间有多少数小于等 ...
- mysql主从同步错误恢复
Mysql主从同步集群在生成环境使用过程中,如果主从服务器之间网络通信条件差或者数据库数据量非常大,容易导致MYSQL主从同步延迟. MYSQL主从产生延迟之后,一旦主库宕机,会导致部分数据没有及时同 ...
- AP设备漫游阈值设置
在多个AP部署的场景下,默认情况下,手持移动设备(如PDA.手机)信号弱到断掉时才切换AP,无线信号很弱的情况下网络是非常的不稳定的,因此我们需要配置AP设备的漫游阈值(RSSI阈值),以便连接的无线 ...