声明:自己学习菜鸟联盟时,自己记得笔记
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()