特点

无模式

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


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

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

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

  1. Thrift的安装和简单演示样例

    本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例.对于具体的解说,后面在进行阐述. Thrift简述                                           ...

  2. Introspector(内省)简单演示样例 与 简单应用

    简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...

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

    什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...

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

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

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

    Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...

  6. Android通过startService播放背景音乐简单演示样例

    关于startService的基本使用概述及其生命周期可參见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单演示样例,演示sta ...

  7. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  8. MyBatis对数据库的增删改查操作,简单演示样例

    之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...

  9. [Android]RecyclerView的简单演示样例

    去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...

  10. 虚幻4Matinee功能 基本概念及简单演示样例(Sequence编辑器)

    虚幻4提供的Matinee功能十分强大,能够用来制作动画.录制视频. 它的核心想法是在Matinee编辑器内提供一套自己的时间坐标系,在这个相对时间内通过调节actor的属性来改变actor的状态,进 ...

随机推荐

  1. jsp出现错误can not find the tag directory /web-inf/tags

    百度google了一大圈没找到中文答案,无奈之下硬着头皮看了一个英文答案http://stackoverflow.com/questions/11502703/eclipse-can-not-find ...

  2. zzulioj--1841--so easy!麻麻再也不用担心我的数学了!(数学水题)

    1841: so easy!麻麻再也不用担心我的数学了! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 27  Solved: 15 SubmitSt ...

  3. Eval函数知识总结

    说道Json,我们先来聊聊eval 一.eval是什么?(解析器) eval是一个函数,看本质function  eval() { [native code] } 二.怎样使用eval? 语法:str ...

  4. NSStream 流式思想

    流式思想的本质是将数据或信号看作流.流的管理者NSStream看作管道. 内容包含两方面: 1.流的建立:源.目的地: 2.流的管理:状态事件与数据事件. 本质上是建立联系.处理数据.处理状态.

  5. php八大设计模式之桥接模式

    一个抽象产生多种具体的实现方式,单纯的通过子类继承会有子类爆炸(过多的子类产生)的现象,系统需要它们之间进行动态耦合. 面向过程: <?php header("content-type ...

  6. Hexo构建Blog系列

    Hexo是一个开源构建blog框架,基于nodejs研发.可以自由切换主题,插件等功能,实现自已酷炫博客需求. 下面是基于hexo实践所产出的一些心得,供大家参考. 基础 Hexo 搭建 Hexo 与 ...

  7. jumpserver 新建用户收不到邮件

    在设置邮件开启pop3/smtp/imap 时 会提示要设置授权码 重启jumpserver 遇到错误  163 邮箱没有收到密码 点击更新没有效果 测试连接成功以后 ,删除用户 ,然后 重新 创建一 ...

  8. Win10 + YOLOv3训练VOC数据集-----How to train Pascal VOC Data

    How to train (Pascal VOC Data): Download pre-trained weights for the convolutional layers (154 MB):  ...

  9. HDU 4309 Seikimatsu Occult Tonneru

    Seikimatsu Occult Tonneru Time Limit: 6000ms Memory Limit: 32768KB This problem will be judged on HD ...

  10. 各大IT企业招聘所须要求技能

    1.中兴 ZTE 软件研发project师 工作地点:西安.深圳.上海.天津 主要职责: 1.从事通讯产品相关软件开发 2.进行软件具体设计,代码编写.单元測试.集成測试.系统測试等 3.进行软件代码 ...