特点

无模式

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. redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请求,导致 redis 短时间不可用

    redis 突然大量逐出导致读写请求block   内容目录: 现象 背景 原因 解决方案 ref 现象 redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请 ...

  2. CURRENMONTH TAG in Automation Framework

    /** * @param input * <CURRENTMONTH><CURRENTMONTH+1> * @return Month "MM" */ pr ...

  3. ubuntu14.04下snort的安装(官方文档安装)(图文详解)

    不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...

  4. java9新特性-4-模块化系统: Jigsaw与Modularity

    1.官方Feature 200: The Modular JDK 201: Modular Source Code 220: Modular Run-Time Images 260: Encapsul ...

  5. Android textView开头空两格问题,排版缩进2个汉字

    一般为了排版,textView中字符段落开头一般都会空两格显示,如下图 但是如果你靠敲击空格来解决那就错了,那样在不同的屏幕上显示会差异,完美的解决方法是用转义字符”\t“,在段首加\t\t就解决.加 ...

  6. JS中的switch case

    function GetDepartmentName(type) { switch (type) { case DepartMentQian: alert($('#DepartMentQian').v ...

  7. NOIP2017 Day-1 模板荟萃

    #include<bits/stdc++.h> #define MAXN 100005 using namespace std; int read(){ ;char c=getchar() ...

  8. 洛谷1005 【NOIP2007】矩阵取数游戏

    问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  9. Linux 中常用的基础命令一

    1.目录相关命令的使用  pwd(printing working directory) 显示当前工作目录    pwd命令相关的环境变量:     PWD  保存了当前工作目录路径     OLDP ...

  10. Python对象引用的所有权

    目录 引用所有权 传递引用的所有权--返回值 出借引用的所有权--返回值 占据引用的所有权--参数 出借引用的所有权--参数 引用所有权 谁持有对象引用的所有权,谁就要对对象负责. 引用的所有权对函数 ...