zoukankan      html  css  js  c++  java
  • 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" : 布尔

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

     
  • 相关阅读:
    BZOJ 1101 [POI2007]Zap
    BZOJ 2005 [Noi2010]能量采集
    BZOJ 1053 [HAOI2007]反素数ant
    BZOJ 4321 queue2
    ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)
    POJ 3268 Silver Cow Party(Dijkstra算法求解来回最短路问题)
    Trie(字典树)解析及其在编程竞赛中的典型应用举例
    POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)
    POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
    POJ 1860 Currency Exchange(如何Bellman-Ford算法判断图中是否存在正环)
  • 原文地址:https://www.cnblogs.com/ruanyifeng/p/5465630.html
Copyright © 2011-2022 走看看