MongoDB 高级教程

声明:自己学习菜鸟联盟时,自己记得笔记

MongoDB 高级教程

1,MongoDB 数据库引用:

使用 DBRefs

DBRef的形式:

{ $ref : , $id : , $db :  }

三个字段表示的意义为:

  • $ref:集合名称

  • $id:引用的id

  • $db:数据库名称,可选参数

2, MongoDB使用覆盖索引查询

@1,MongoDB的不会去数据库文件中查找。相反,它会从索引中提取数据,这是非常快速的数据查询。

@2,不包括 id 字段,id在查询中会默认返回,我们可以在MongoDB的查询结果集中排除它。

db.collection.ensureIndex({filed:1,filed:2})

3,MongoDB 查询分析

1,3.2 以前的版本 前

> db.users.ensureIndex({gender:1,user_name:1})
> db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

2,3.2 以后的版本 后

 db.collection.explain("executionStats").find()
​
 https://blog.csdn.net/qq_17475155/article/details/53876834

3,使用 hint 来强制 MongoDB 使用一个指定的索引

> db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
​
MongoDB3.2及其以前的版本 --> 可以使用 explain() 函数来分析以上查询:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
​
MongoDB3.2以后的版本
db.users.explain("executionStats").find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

4,MongoDB 原子操作

解释 :mongodb不支持事务,所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。

db.collection.findAndModify() 方法来判断书籍是否可结算并更新新的结算信息

db.books.findAndModify ( {
   query: {
            _id: 123456789,
            available: { $gt: 0 }
          },
   update: {
             $inc: { available: -1 },
             $push: { checkout: { by: "abc", date: new Date() } }
           }
} )

@1,原子操作常用命令

$set

用来指定一个键并更新键值,若键不存在并创建。

{ $set : { field : value } }

$unset

用来删除一个键。

{ $unset : { field : 1} }

$inc

$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。

{ $inc : { field : value } }

$push

用法:

{ $push : { field : value } }

把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。

$pushAll

同$push,只是一次可以追加多个值到一个数组字段内。

{ $pushAll : { field : value_array } }

$pull

从数组field内删除一个等于value值。

{ $pull : { field : _value } }

$addToSet

增加一个值到数组内,而且只有当这个值不在数组内才增加。

$pop

删除数组的第一个或最后一个元素

{ $pop : { field : 1 } }

$rename

修改字段名称

{ $rename : { old_field_name : new_field_name } }

$bit

位操作,integer类型

{$bit : { field : {and : 5}}}

偏移操作符

> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
 
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
 
> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

5,MongoDB 索引

db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})  # 建索引
​
db.users.explain('executionStats').find({tags:'cricket'})      # explain查询索引是否应用了
​
// 根据索引查数据
​
db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"}).pretty()

6,MongoDB 索引限制

每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。

如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。


查询限制

索引不能被以下的查询使用:

  • 正则表达式及非操作符,如 $nin, $not, 等。

  • 算术运算符,如 $mod, 等。

  • $where 子句

所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看

最大范围

  • 集合中索引不能超过64个

  • 索引名的长度不能超过128个字符

  • 一个复合索引最多可以有31个字段


7,MongoDB ObjectId

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳

  • 接下来的3个字节是机器标识码

  • 紧接的两个字节由进程id组成(PID)

  • 最后三个字节是随机数。

创建新的ObjectId

newObjectId = ObjectId()

你也可以使用生成的id来取代MongoDB自动生成的ObjectId:

> myObjectId = ObjectId("5349b4ddd2781d08c09890f4")
ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()  #时间
ISODate("2014-04-12T21:49:17Z")
​
new ObjectId().str     #字符串

8,MongoDB Map Reduce

Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。

MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

MapReduce 命令

以下是MapReduce的基本语法:

>db.collection.mapReduce(
   function() {emit(key,value);},  //map 函数
   function(key,values) {return reduceFunction},   //reduce 函数
   {
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

9, 正则表达式

以下命令使用正则表达式查找包含 runoob 字符串的文章:

>  db.posts.find({post_text:{$regex:"runoob"}})

以上查询也可以写为:

>  db.posts.find({post_text:/runoob/})

不区分大小写的正则表达式

db.posts.find({post_text:{$regex:"runoob",$options:"$i"}})

数组元素使用正则表达式

> db.posts.find({tags:{$regex:"run"}})

优化正则表达式查询

var name=eval("/" + 变量值key +"/i"); 
​
title:eval('/'+title+'/i')  // 等同于 title:{$regex:title,$Option:'$i'}

10,mongodb 自动增长

>db.counters.insert({_id:"productid",sequence_value:0})
​
>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"})
​
>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"})
   
   >db.products.find()

猜你喜欢

转载自blog.csdn.net/gaokcl/article/details/85327977