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:[email protected]: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

近期在项目中实际遇到的两个注意点:

1、一次不能对同一个属性字段进行两次操作;

2、$inc或$set等操作时,不能时empty。

參考资料

http://jysperm.me/technology/1575

http://www.cppblog.com/dead-horse/archive/2011/09/23/156617.html

https://github.com/kissjs/node-mongoskin

文档信息

  • 最后改动时间:2014年07月19日 15:12
时间: 2024-12-29 23:18:29

MongoDB + node-mongoskin简单演示样例的相关文章

一则简单演示样例看Oracle的“无私”健壮性

Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlzYWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 收集统计信息: 创建B树索引: 2. 运行select id from tbl_plan;查看它的运行计划: 由于创建了

[hadoop系列]Pig的安装和简单演示样例

inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yahoo!捐献给Apache的一个项目,眼下还在Apache孵化器(incubator)阶段,眼下版本号是v0.5.0.Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-like语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运

JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例

什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MSC 替换了之前的 JMX Kernel 和 MicroContainer,它主要特定能够总结例如以下三点: 高并发容器(A highly concurrent state machine) 无多相位,设计简单(No multiple phases, much simpler) 不依赖 JMX 和 J

XLSTransformer生成excel文件简单演示样例

项目结构图: 项目中所用到的jar,能够到http://www.findjar.com/index.x下载 ExcelUtil类源代码: package util; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.jxls.exception.ParsePropertyExcep

一个简单演示样例来演示用PHP訪问表单变量

首先编写表单页面orderform.html,用post方法请求服务端脚本文件:processorder.php orderform.html: <!DOCTYPE html> <html> <head lang="zh_CN"> <meta charset="UTF-8"> <title>订单页面</title> </head> <body> <h2>Jas

Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例

今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libevent的安装,以及利用libevent框架编写一个间隔1s打印 Hello Libevent! 信息的程序. 首先是安装: 1 下载libevent源代码,下载地址http://libevent.org/.我下载的版本号是2.0 stable版本号.下载的文件格式是tar.gz包 2 进入刚下载得到的t

最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例

最简单的视音频播放演示样例7:SDL2播放RGB/YUV

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例

展示C代码覆盖率的gcovr工具简单介绍及相关命令使用演示样例

(本人正在參加2015博客之星评选,诚邀你来投票,谢谢:username=zhouzxi">http://vote.blog.csdn.net/blogstar2015/candidate?username=zhouzxi) 近期,由于要展示某项目的单元測试的代码覆盖率.我无意间在网上找到了gcovr工具.使用之后,认为这个工具相当的不错,于是便写下这篇文章,可供相关的开发者參考. 简而言之,gcovr是一个将单元測试中的代码覆盖率以多种方式(包含列表方式.XML文件方式.HTML网页方式