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的状态,进 ...
随机推荐
- redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请求,导致 redis 短时间不可用
redis 突然大量逐出导致读写请求block 内容目录: 现象 背景 原因 解决方案 ref 现象 redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请 ...
- CURRENMONTH TAG in Automation Framework
/** * @param input * <CURRENTMONTH><CURRENTMONTH+1> * @return Month "MM" */ pr ...
- ubuntu14.04下snort的安装(官方文档安装)(图文详解)
不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...
- java9新特性-4-模块化系统: Jigsaw与Modularity
1.官方Feature 200: The Modular JDK 201: Modular Source Code 220: Modular Run-Time Images 260: Encapsul ...
- Android textView开头空两格问题,排版缩进2个汉字
一般为了排版,textView中字符段落开头一般都会空两格显示,如下图 但是如果你靠敲击空格来解决那就错了,那样在不同的屏幕上显示会差异,完美的解决方法是用转义字符”\t“,在段首加\t\t就解决.加 ...
- JS中的switch case
function GetDepartmentName(type) { switch (type) { case DepartMentQian: alert($('#DepartMentQian').v ...
- NOIP2017 Day-1 模板荟萃
#include<bits/stdc++.h> #define MAXN 100005 using namespace std; int read(){ ;char c=getchar() ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- Linux 中常用的基础命令一
1.目录相关命令的使用 pwd(printing working directory) 显示当前工作目录 pwd命令相关的环境变量: PWD 保存了当前工作目录路径 OLDP ...
- Python对象引用的所有权
目录 引用所有权 传递引用的所有权--返回值 出借引用的所有权--返回值 占据引用的所有权--参数 出借引用的所有权--参数 引用所有权 谁持有对象引用的所有权,谁就要对对象负责. 引用的所有权对函数 ...