mongodb

简介

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权威指南