一、游标

先插入一张表的数据

for(i=0; i<100; i++) { db.c.insert({x : i}); }

定义一个游标

var cursor = db.c.find();

以循环的方式输出游标的数据

while (cursor.hasNext()) { obj = cursor.next(); print(obj.x); }

二 、limit、 skip、sort

db.c.find().limit(3) 取出前三行

db.c.find().skip(3) 滤到前三行,

db.c.find().skip(10).limit(5)从11行开始,读出5行。

定义一个游标 并按x列排序,1 表示升序,-1表示降序

var cursor= db.c.find().skip(10).limit(6).sort({"x":1)});

(一)、用skip实现分页

n 当skip大量行的时候,会比较慢

//do not use , slow for large skips

var page1 = db.foo.find(criteria).limit(100)

var page1 = db.foo.find(criteria).skip(100).limit(100)

var page1 = db.foo.find(criteria).skip(200).limit(100)

(二)、技巧

var page1 = db.foo.find().sort({"date":-1}.limit(100)

var latest = null

//display first page

whill (page1.hasNext(*)){

last=page1.next();

display(latest);

}

//get the next page

var page2 = db.foo.find ({"data":("$gt":latest.data}});

page2.sort({"date":-1}.limit(100)

这样做就不会存在大量的分页。

(三)、随机抽取文档

db.people.insert({"name" : "joe", "random" : Math.random()})

db.people.insert({"name" : "john", "random" : Math.random()})

db.people.insert({"name" : "jim", "random" : Math.random()})

db.people.find()

var random = Math.random()

result = db.people.findOne({"random" : {"$gt" : random}})

三、索引

(一)特点 

  • 可以在任意列上建立索引
  • 索引的构造和使用与传统关系型数据库几乎一样,适用于Oracle的优化技巧也适用于Mongodb
  • 使用索引可以加快查询,但同时会降低修改,插入等的性能
  • 内嵌文档照样可以建立使用索引

    (二) 建立索引

    1、先做一个集合

    db.people.insert([

    { "username" : "smith", "age" : 48, "user_id" : 0 },

    { "username" : "smith", "age" : 30, "user_id" : 1 },

    { "username" : "john", "age" : 36, "user_id" : 2 },

    { "username" : "john", "age" : 18, "user_id" : 3 },

    { "username" : "joe", "age" : 36, "user_id" : 4 },

    { "username" : "john", "age" : 7, "user_id" : 5 },

    { "username" : "simon", "age" : 3, "user_id" : 6 },

    { "username" : "joe", "age" : 27, "user_id" : 7 },

    { "username" : "jacob", "age" : 17, "user_id" : 8 },

    { "username" : "sally", "age" : 52, "user_id" : 9 },

    { "username" : "simon", "age" : 59, "user_id" : 10 }

    ])

     2、建立索引

    db.people.ensureIndex({"username" : 1}) //1表示是(正向)升序的索引

    db.people.ensureIndex({"username" : 1,"age":-1}) //建立复合(组合)索引

    explain()函数显示执行计划(执行过程)

    db.people.find().explain()

    indexFilterSet: false 显示没有使用索引

    3、查看索引

    查看当前数据库的各集合的索引

    db.system.indexes.find()

    4、删除索引

    db.runCommand({"dropIndexes":"peole","index":"age_1"})

    删除people表中名为age_1的索引

    db.runCommand({"dropIndexes":"peole","index":*})

    删除people表中所有的索引

     四、其他操作

    (一)、聚合

    1、count

    查看数据集合中有多少行

    db.people.count()

    2、distinct

    db.runCommand({"distinct" : "people", "key" : "age"})

    3、group

    分组求和

    db.people.group({

    "key":{"username":true},

    "initial": {"csum": 0 },

    "reduce":function(obj, prev)

    {

    prev.csum += obj.age;

    }

    })

    另外一个例子

    doc 是行扫描,prev是记算保存的结果

    (二)、把函数当做key

    To define a grouping function, you must use a $keyf key (instead of "key"). Using "$keyf" makes the group command look something like this:

    db.posts.group({"ns" : "posts",

    "$keyf" : function(x) { return x.category.toLowerCase(); },

    "initializer" :

    })

    "$keyf" allows you can group by arbitrarily complex criteria.

    (三)、MapReduce

    n        与Hadoop的Map-Reduce神似

    n        能完成count、distinct、group所能做的一切事情

    例子:寻找集合中所有的键

    先定义一个map函数

    map = function() { for (var key in this) { emit(key, {count : 1});

    }};

    再定义一个reduce函数

    reduce = function(key, emits) {

    total = 0;

    for (var i in emits) {

    total += emits[i].count;

    }

    return {"count" : total};

    }

    db.runCommand({"mapreduce" : "people", "map" : map, "reduce" : reduce,"out":"result"})

    这个函数的说明 :

    {"mapreduce" : "people"意思是在people这个集合中做mapreduce操作

    "map" : map, "reduce" : reduce,"指明map函数和reduce函数,

    "out":"result" 说明输出到那个集合

    最后可以用 db.result.find()来查看来次操作的结果。

     (四)、冷备份

    关闭mongodb的情况下复制数据目录

    (五)热备份

    mongodump 出来的json和bson这种形式的文件

    mongodump -d db

    -o 重新指定dump文件存放位置

    备份出来的数据还源

    mongorestore -d foo --drop backup/test/

    -d foo 表示还原到foo这个数据库中,

    --drop backup/test/ 表示把原始的的backup/test/删除了。

    (六)、强制一致

    use admin //管理数据库

    db.runCommand({"fsyns":1,"lock":1}) //把缓冲区的数据全部写到硬盘,然后加一把锁,不让数据再写入进来,

    db.$cmd.sys.unlock.findOne();备份完成后解锁。

    (七)、修复数据库

    修复所有数据库:用带—repair参数启动

    db.repairDatabase()

    (八)、GridFS

    从mogodb存放超过16M的文件

    n 用于在数据库里存储二进制大文件

    n 可以统一用数据库处理数据,而无需借助外部的文件系统

    n 可以利用MongoDB的复制或分片机制,故障恢复和可扩展性较好

    n 避免使用文件系统的某些限制(例如linux在同一目录下的文件数限制)

    n 避免文件碎片(MongoDB分配空间以2GB作为单位)

    GridFS存放的原理

  • 文件被分成若干块,每个块作为一个文档存储
  • 有一个单独的文档存储分块的信息,以及文件的元数据
  • fs.chunks集合存入具体的数据
  • fs.files集合 存入元数据

    五、完成器

    (一)、先完成聚合

    db.posts.group({

    "key" : {"tags" : true},

    "initial" : {"tags" : {}}, //输出的也是tags

    "$reduce" : function(doc, prev) {

    for (i in doc.tags) {

    if (doc.tags[i] in prev.tags) {

    prev.tags[doc.tags[i]]++;

    }else {

    prev.tags[doc.tags[i]] = 1;

    }

    }

    }})

    (二)、再用完成器,确定当天最受欢迎的标签

    "finalize" : function(prev) {

    var mostPopular = 0;

    for (i in prev.tags) {

    if (prev.tags[i] > mostPopular) {

    prev.tag = i;

    mostPopular = prev.tags[i];

    }

    }

    delete prev.tags

    }}})

mongodb进阶的更多相关文章

  1. MongoDb进阶实践之六 MongoDB查询命令详述(补充)

    一.引言         上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入,对查询又有了新的东西,决定补充进来.如果大家想看上一篇有关MongoDB查询的 ...

  2. mongodb进阶一之高级查询

    上篇文章我们讲了mongodb的crud基本操作 http://blog.csdn.net/stronglyh/article/details/46812579 这篇我们来说说mongodb的进阶-- ...

  3. MongoDB 进阶模式设计

    原文链接:http://www.mongoing.com/mongodb-advanced-pattern-design 12月12日上午,TJ在开源中国的年终盛典会上分享了文档模型设计的进阶技巧,就 ...

  4. MongoDb进阶实践之一 如何在Linux(CentOS 7)上安装MongoDB

    一.NoSQL数据简介         1.NoSQL概念                   NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是 ...

  5. MongoDb进阶实践之二 如何在Windows上配置MongoDB

    一.引言            上一篇文章,我介绍了如何在Linux系统上安装和配置MongoDB,其实都不是很难,不需要安装和编译,省去了Make && Make Install 命 ...

  6. MongoDb进阶实践之三 Mongodb基本命令详解

    一.引言              从今天开始,我要正式开始介绍MongoDB的使用方法了.在此之前,我用了两篇文章分别介绍了如何在Linux系统和Windows系统上安装和配置MongoDB系统.如 ...

  7. MongoDb进阶实践之三 MongoDB查询命令详述

    一.引言           上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命 ...

  8. MongoDb进阶实践之五 MongoDB修改命令详述

    一.引言         上一篇文章我们已经详细介绍了MongoDB数据库的有关查询的内容,但是这只是所有查询命令的冰山一角.所有查询命令都写完也没有必要,我只是写了一些常用的命令,对MongoDB的 ...

  9. MongoDb进阶实践之七 MongoDB的索引入门

    一.引言     好久没有写东西了,MongoDB系列的文章也丢下好长时间了.今天终于有时间了,就写了一篇有关索引的文章.一说到"索引",用过关系型数据库的人都应该知道它是一个什么 ...

随机推荐

  1. BZOJ 3211: 花神游历各国【线段树区间开方问题】

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 3514  Solved: 1306[Submit][Status][Discu ...

  2. Codeforces Round #326 (Div. 2) B

    1.每一个合数都可以由若干个素数相乘而得到 2.质因数知识 :求一个数因数的个数等于它的每个质因数的次数加一的和相乘的积因为质因数可以不用,所以要加一.例如6=2x3,两个质因数都是一次,如果两个质因 ...

  3. Ubuntu搭建Gitlab服务器

    想到Gitlab就必定会想到SVN,因为两者都是代码管理系统,作为开发人员来说,用习惯了SVN的图形化界面和SVN代码更新和提交的方式, 可能就会觉得使用git会比较麻烦,其实不然git使用起来非常方 ...

  4. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

  5. JavaScrip 排序算法

    转自: http://blog.givebest.cn/javascript/2017/08/02/javascript-sorting-algorithms.html 基础构造函数 以下几种排序算法 ...

  6. dedecsm系统(企业简介)类单栏目模版如何修改和调用整理

    作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-15 17:33:07 我要评论 我们的模版里应该都有article_article.htm这个模版;article_article.htm ...

  7. HTML5 Canvas圆盘抽奖应用(适用于Vue项目)

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  8. putty 与winscp 区别

    https://zhidao.baidu.com/question/377968180.html putty 与winscp 有什么区别, 装了 winscp 可以由 putty 替换么 ? 具体用法 ...

  9. 关于IDE与环境变量的一点说明

    环境变量就是当计算机要执行操作时,在环境变量所制定的范围内查找该操作. 比如linux的ls命令,计算机就需要在$PATH规定的目录中寻找该ls的可执行文件. java的classpath,在该规定的 ...

  10. MYBATIS异常:INVALID BOUND STATEMENT

    1.mapper.xml中namespaces错误(***) 2.方法不存在 3.方法返回值错误