Mongodb——1

BSON

BSON是一种类似JSON的二进制形式的存储格式,简称Binary JSON。它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。它支持下面数据类型。每个数据类型对应一个数字,在MongoDB中可以使用$type操作符查看相应的文档的BSON类型

类型 对应数字 别名 说明
Double1 1 double
String 2 string
Object 3 object
Array 4 array
Binary data 5 binData
Undefined 6 undefined 弃用
ObjectId 7 objectId
Boolean 8 “bool”
Date 9 “date”
Null 10 “null”
Regular Expression 11 “regex”
DBPointer 12 “dbPointer”
JavaScript 13 “javascript”
Symbol 14 “symbol”
JavaScript(with scope) 15 “javascriptWithScope”
32-bit integer 16 “int”
Timestamp 17 “timestamp”
64-bit integer 18 “long”
Min key -1 “minKey”
Max key 127 “maxKey”

CRUD

增删改差操作

db.collection.insert()、db.collection.insertOne()、db.collection.insertMany(),后两个在3.2版本新加入。在mongodb中,插入作用于单个集合collection。

在mongodb中,所有的写操作在单个文档的层面上是原子的。如果一个操作涉及多个文档的写操作,那么单个文档的写操作是原子的,整个操作不是院子的。
_id是每个文档都会有的主键。如果插入的时候没有指定_id,那么mongodb会自动生成一个ObjectId作为_id。
ObjectId是mongodb中的一个数据类型。

db.users.insert(
   {
      name: "sue",
      age: 19,
      status: "P"
   }
)

这里插入的是json格式的数据,mongodb转化为bson格式进行保存。
db.collection.insertOne() 插入一个,db.collection.insertMany() 插入多个,insert可以一个可以多个。

mongodb插入数据还有db.collection.save()。save的插入逻辑如下:如果没有指定_id,则会直接调用insert命令进行插入;如果指定了_id,那么会调用update()命令同时指定upsert为true,即有对应的就更新,没有对应的就插入。

db.collection.remove()、db.collection.deleteOne()、db.collection.deleteMany(),分别是普通删除、删除一个、删除多个。
通过传入过滤器进行删除操作,这里的过滤器是指json文档。mongodb会对符合json过滤器的文档进行删除。如果传入一个空过滤器,会删除所有文档(只限于db.collection.remove()和db.collection.deleteMany())。
如果想删除多个文档,使用remove和deleteMany;如果想删除一个文档,使用remove(将第二个参数设为 1)和deleteOne。

db.users.remove( { status: "D" }, 1)

此时remove只会删除一个文档。当不使用第二个参数时,为删除多个。

db.collection.updateOne():更新一个
db.collection.updateMany():更新多个
db.collection.replaceOne():替换一个
db.collection.update():默认更新一个,可以使用multi参数设定更新多个
接收参数为:

  1. 过滤条件文档,包括普通的文档和使用查询操作符的文档。
  2. 更新文档
  3. 更新选项,比如update中是否进行upsert,是否对多个文档更新multi

一般使用update进行更新操作。因为update支持操作符更新,replace只能更新全文档。

db.collection.find():查询操作

  1. query:过滤条件,为一个json文档。分为普通文档和使用操作符的文档。

    查询操作符:{ : { : }, ... },这里field1为查询字段名,operator1为查询操作符,value1为查询值。
    AND操作:直接在文档里并排表示
    OR操作:使用$or操作符 {$or: [ { status: "A" }, { age: { $lt: 30 } } ] }
    嵌入文档查询,有两种方式。第一种将整个嵌入文档完整查询。比如{"comments" : {"one" : 1, "two" : 2}},此时嵌入文档只能完整查询,不能只查询其中的某些字段,比如{"comments" : {"one" : 1}}是查不到数据的。第二种是嵌入文档的某些字段的查询,使用{"comments.one" : 1},用英文句号表示嵌入文档的字段,可以只查询某些字段。
    数组查询。如果写上数组标识[ ],这时只会查询完整符合查询条件的数组,比如{ badges: [ "blue", "black" ] },元素内容和顺序都不能错。如果只想查询某个元素,则{ badges: "black" }。如果想查询某个位置的元素,使用英文句号{ "badges.0": "black" }。

  2. field:返回的字段,用json文档键值对表示,1或true表示返回,0或false表示不返回。嵌入文档的字段同查询一样,使用英文句号分割

  3. limit:限制返回文档的个数

  4. skip:跳过指定的文档个数

  5. sort:排序,使用json键值对文档进行表示,1 为升序,-1 为降序。

  6. 游标:mongodb会把find结果返回为一个游标,在shell和java client中都是这样。使用游标去迭代数据,可以防止单次传输大量数据。

先 sort 再 skip 再 limit

索引

mongodb支持单字段索引、复合索引、多key索引、文本索引、地理位置索引等。

  • 单字段索引:例如 db.person.createIndex( {age: 1} ) 。可以加速对age字段的各种查询请求,默认的_id索引也是单字段索引。{age: 1} 代表升序索引,也可以通过{age: -1}来指定降序索引,对于单字段索引,升序/降序效果是一样的。
  • 复合索引:针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推。例如 db.person.createIndex( {age: 1, name: 1} )。复合索引可以支持多个字段的组合查询,也能满足符合索引前缀的查询。除了查询的需求能够影响索引的顺序,字段值的分布也是一个重要的因素,查询的时候也要考虑字段的顺序。
  • 多key索引:当索引的字段为数组时,创建的索引为多key索引。duokey索引会为数组中的每个元素建立一条索引。
  • 文本索引:能够进行文本内容搜索,性能不好。
  • 地理位置索引:可以对地理位置进行索引,一般用于定位需求。

在mongodb中,索引满足前缀索引,这是由mongodb的索引实现造成的。mongodb默认的索引实现为B树,是一种针对磁盘IO进行优化的树。在B树中,节点中的数据范围是顺序排列的,所以可以实现前缀索引。有的mongodb存储引擎支持哈希索引,查询速度更快,但是不能进行范围搜索。
在mongodb中,可以为索引设置一些属性:

  • 唯一索引:索引的字段不能出现重复值,比如_id索引
  • TTL索引:可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期 或 在某个时间点过期)
  • 部分索引:只针对某个特定条件的文档建立索引,3.2后支持
  • 稀疏索引:只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况
索引优化

mongodb支持对请求进行profiling。目前支持三种级别的profiling:

  • 0:不开启profiling
  • 1:将处理时间超过某个阈值(默认100ms)的请求,记录到DB下的system.profile集合
  • 2:将所有的请求都记录到system.profile集合

通常,生产环境建议使用1级别的profiling,并根据自身需求配置合理的阈值,用于监测慢请求的情况,并及时的做索引优化。
索引过多会造成写入、更新的性能地下,索引并不是越多越好,需要根据实际情况进行优化。

你可能感兴趣的:(Mongodb——1)