简介
MongDB基于分布式文件存储的数据库,目的:为web应用提供可扩展的高性能数据存储解决方案。
高性能、开源、无模式的文档型数据库
Document和BSON
BSON:数据格式(类似JSON,比JSON多一些数据类型,如Date和BinData)
Advantage: 轻量、可遍历、高效
Disadvantage:空间利用率不高?
Document:基础单元(由多个key-value及关联的值有序的放置一起)
插入文档
Db.collection.insert(document)
Ex. db.person.insert([{name : ‘ Ryan‘,age :29},{name : ‘sam’,age :28}]) ;
查询文档
1. Find
Db.collection.find(criteria,projection)
如: db.person.find()
2. Update
Db.collection.update(query,update,{upsert :boolean,multi:Boolean}) ;
Query :查询条件,update :修改内容,upsert :如果没有对应内容是否创建新文档,multi:更新符合条件的所有文档
db.person.update({age:{$lt:30}},{$set:{status:"X"}},{multi:true})
3. Save
可以更新插入一个文档,只能对一个文档进行操作
db.person.save({name:"Tony",age:12,gender:"man"})
4. Remove
Db.collection.remove(query,justOne)
justOne:是否只删除一个文档
db.person.remove({age:12});
单字段查询
- 相等条件
db.person.find({status:"X"})
2. 比较条件
$gt(大于), $gte(大于等于), $lt(少于), $lte(少于等于), $ne(不等于), $in(不包含), $nin(不包含)
db.person.find({age:{$gt:40}})
3. 数组条件
当字段 数组可以进行完全匹配或者匹配特定值
Db.inventory.find({tags:[‘’,’’,’’]})
4. 子文档条件
db.mycol.find({"access.level":5});
复合查询
- AND
db.person.find({$and:[{age:{$gt:30}},{name:"Lucy"}]});
2. OR
db.person.find({$or:[{status:"A"},{age:30}]})
游标和结果集
Find命令不值得返回结果集,返回结果集的迭代器
Var myCursor = db.person.find({status:”A”});
myCursor.forEach(printjson)
- 限制条件-结果集
Db.person.find().limit(3)
2. 字段条件-结果集
Db.person.find({},{status:1,age:1}) //等于1表示需要返回,0表示不需要返回
3. Skip限制返回记录的起点
db.users.find().skip(1).limit(1)
4. Sort排序
db.users.find().sort({age:-1}); //-1倒序,1为正序
MongDB复杂查询
- 多条件操作符
db.users.find({age:{$gt:19,$lt:45}})
2. 匹配所有$all
类似于in,只是[]内的所有值都必须匹配满足
db.users.find({course:{$all:["js","Mongodb"]}});
3. 是否存在$exists
db.users.find({sex:{$exists:true}})
4. NULL过滤
db.users.find({sex:{"$in":[null], "$exists":true}});
5. $mod取模运算
db.users.find({age:{$mod:[5,1]}})
6. $ne不等于
db.users.find({age:{$ne:20}})
7. $in 包含
db.users.find({age:{$in:[11,26]}})
8. $nin不包含
db.users.find({age:{$nin:[18,20]}})
9. $size数组元素个数
10. 正则表达式匹配
db.users.find({name:{$not:/^T.*/}});
11. Javascript查询和where查询
db.c1.find( { a : { $gt: 3 } } );
db.c1.find( { $where: "this.a > 3" } );
db.c1.find("this.a > 3");
f = function() { return this.a > 3; } db.c1.find(f);
12. Count
Db.users.count();
存储过程
MongoDB的存储过程使用javascript来写,存储过程存储于db.system.js
db.system.js.save({_id:”addName”,value:function(x,y){}});
- 查询存储过程
db.system.js.find()
2. Eval函数,调用存储过程
db.eval(‘addName(3,5)’);
匿名存储过程:db.eval(function(){})
MongoDB的聚合
- Aggregate
聚合多个条件的数组集
Db.users.aggregate([{$skip:5},{$project:{id:0,name:1}}])
2. Match
3. Project投射
可以从子文档中提取字段,重命名字段,对这些字段进行操作
db.articles.aggregate({$project:{"author":1,"_id":0}})
db.articles.aggregate({"$project":{"userId":"$_id","_id":0}});
4. Group分组
5. Unwind拆分
db.blogs.aggregate({$project:{“comments”:”$comments”}},{$unwind:”$comments”},{$match:{“comments.author”:”Mark”}})
6. 使用管道
在使用管道开始阶段(执行$project、$group、$unwind操作之前),尽可能地过滤掉文档和字段
Map/Reduce
MapReduce是一种编程模型,用于大规模数据集>1TB的并行计算
Map(映射)Reduce(规约)
map=function(){ for(var key in this){ emit(key,{count:1}) }}; reduce=function(key,emits){ total=0; for(var i in emits){ total+=emits[i].count; } return {count:total}; } mr = db.runCommand({"mapreduce" : "foo", "map" : map,"reduce" : reduce})
实例:
Map=function(){ For(var I in this.tags){ Var recency = 1/(new Date()- this.date); var score = recency*this.score; Emit(this.tags[i],{“urls”:{this.url},”score”:this.score}} } Reduce= function(key,emits){ Var total ={“urls”:[],”score”:0}; For(var i in emits){ Emits[i].urls.forEach(function(url){ Total.url.push(url); total.score+=emits[i].score }) Return total; }
MapReduce的其他可选健
"finalize" : 函数
将reduce的结果发送给这个键,这是处理过程的最后一步。
"keeplize" : 布尔
如果值为true,那么在连接关闭时会将临时结果集合保存下来,否则不保存。
"output" : 字符串
输出集合的名称,如果设置了这项,系统会自动设置keeptemp : true。
"query" : 文档
在发往map函数前,先用指定条件过滤文档。
"sort" : 文档
在发往map函数前给文档排序(与limit一同使用非常有用)。
"limit" : 整数
在发往map函数的文档数量的上限。
"scope" : 文档
可以再Javascript代码中使用的变量。
"verbose" : 布尔
是否记录详细的服务器日志