简介
MongoDB是NoSQL(Not Only SQL)非关系型数据库中的一种。基本数据单元是文档(document),可以看成是JSON的扩展--BSON(Binary Serialized Document Format)。集合(collection)是一组(通常建议同种类型)文档,可以看作是一个拥有动态模式(dynamic schema)的表。由于没有预定义模式(predefined schema),字段的增删/schema的动态变动变得容易,因此最后项目中使用了MongoDB设计存储模块。
工具
Robomongo: https://robomongo.org
数据类型
支持JSON的所有数据类型:null、布尔、数值、字符串、数组和对象
- null
- 布尔
- 数值. 默认浮点数,整型值用NumberInt()或NumberLong()
- 字符串
- 数组. 能作为有序对象(如列表、栈或队列),也能作为无序对象(如数据集)来操作.
- 对象. ObjectID()
- 日期. new Date()
- 内嵌文档。被嵌套的文档作为父文档的某个key的值
基本操作
insert(),find()/findOne(),update(),remove()
插入
insert()插入一个;batchInsert([])批量插入。
删除。
remove()删除所有文档当不删集合和集合元信息;drop()删除集合;remove(条件)删除符合条件的文档。
更新。
文档替换。
update(criteria, 新文档)。 其中criteria用于定位目标文档。
更新文档中的一部分,
对文档中的某些字段进行更新。使用原子性的更新修改器(update modifier):
- “$inc”修改器。增加已有键的值,或者该键不存在则创建一个。用于更新分析数据、因果关系、投票或者其他有变化数值的地方. 只能用于整型、长整型或双精度浮点型的值
- update(criteria, {“$inc”:{“count”:1}}) 使用”$inc”使count值增加1
- “$set”修改器。用来指定一个字段的值。如果这个字段不存在,则创建它。即用于更新模式或者增加用户定义的键
- update(criteria,{“$set”:{k,v}}).添加键/更改值。v可以是数组。
- update(criteria,{“$unset”:{k,v}}).删除键。
- update(criteria,{“$set”:{d.k,v}}). 修改内嵌文档。d是文档中的内嵌文档的key。
- 数组修改器。
- “$push”修改器。如果数组已经存在,会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。
- “$addToSet”修改器。将数组作为集合使用,保证增加元素时数组内的元素不会重复。
- “$pop”修改器。数组看成队列或者栈从数组中删除元素。{“$pop”:{“key”:1}}从数组末尾删除一个元素,{“$pop”:{“key”:-1}}则从头部删除。
- “$pull”修改器。按特定条件来删除元素。update({},{“$pull”:criteria})。其中criteria用于定位元素。
- 基于位置(数组下标)的修改器。比如 {“$set”:{“attributes.0.alive”:false}}
- 基于定位操作符”$”的修改器。”$”用来定位查询文档已经匹配的数组元素,定位符只更新第一个匹配的元素。. update({“attributes.name”:”year”},{“$set”:{“attributes.$.alive”:false}})
upsert更新。
要是没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。 update(条件文档,修改器文档,true),update的第3个参数表示这是个upsert.
save函数。
是一个shell函数,如果文档不存在,自动创建文档;如果文档存在,则更新这个文档。它只有一个参数:文档。如果这个文档含有”_id”键,save会调用upsert。否则,调用insert。
更新多个文档。
默认只对符合匹配条件的第一个文档执行操作。要更新所有匹配的文档,可以将update的第4个参数设置为true。
findAndModify命令。
查询。
find查询。
- find(). 批量返回集合c中的所有文档
- find(doc). find的第一个参数是一个文档,向查询文档中添加键/值对时,即指定查询条件;加入多个键/值对,即组合条件查询。
- find(doc,{“key1”:1,”key2”:0}). find的第二个参数指定需要返回的键。1表示返回key1,0表示剔除查询结果中的key2。
查询条件。
- 比较操作符:”$lt”(小于)、”$lte”(小于等于)、”$gt”(大于)、”$gte”(大于等于)、”$ne”(不等)。 {“age”:{“$gte”:18,”$lte”:30}} 指定查询条件为”age”字段大于等于18、小于等于30的所有文档。
- OR查询。
- “$in”,对单个键做OR查询。{“num”:{“$in”:[1,2,7]}},条件数组中的值可以是不同类型的数据。
- “$nin”, 返回与数组中所有条件都不匹配的文档.
- “$or”, {“$or”:包含所有可能条件的数组}
- “$not”,查找与条件不匹配的文档。与正则表达式联合使用时用来查找与特定模式不匹配的文档。
- “$and”,“$nor”
特定类型的查询
- 正则表达式。使用Perl兼容的正则表达式(PCRE)库。
- 查询数组。 假设有如下文档 {“key”:[“v1”,”v2”,”v3”]}
- 匹配一个元素。查询条件(实质是一个文档) {“key”:”v2”}
- 匹配多个元素。“$all”。 查询条件 {“key”,{“$all”:[“v1”,”v2”]}}.返回满足条件(包含值v1和v2)的所有文档。
- 查询数组特定位置的元素。key.index。 查询条件{“key.2”:”v3”},返回数组第三个元素值为”v3”的所有文档。数组下标是从0开始的。
- “$size”,用于查询特定长度的数组。
- “$slice”,返回某个键匹配的数组元素的一个子集. findOne(criteria,{“key”:{“$slice”:10}}) 返回前10;findOne(criteria,{“key”:{“$slice”:-10}}) 返回后10条; findOne(criteria,{“key”:{“$slice”:[23,10]}}) 返回第24~33个元素。
- $操作符。 find(criteria,{“key.$”:1}) 返回第一个匹配的文档.
- “$elemMatch”,同时使用查询条件中的各个语句与一个数组元素进行比较。但不会匹配非数组元素。
- 查询内嵌文档。“$elemMatch”将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到。
- “$where”,用于在查询中执行任意的JavaScript,在速度上要比常规查询慢很多,应避免使用。
参考文献
Mongodb权威指南