MongoDB入门

简介

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});

单字段查询

  1. 相等条件
  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});

复合查询

  1. 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)

  1. 限制条件-结果集

    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复杂查询

  1. 多条件操作符
    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){}});

  1. 查询存储过程

    db.system.js.find()

  2. Eval函数,调用存储过程

    db.eval(‘addName(3,5)’);

    匿名存储过程:db.eval(function(){})

MongoDB的聚合

  1. 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" : 布尔

  是否记录详细的服务器日志

 

 
posted @ 2016-05-06 14:56  RyanRuan  阅读(402)  评论(0编辑  收藏  举报
View Code