查找文档

筛选查找

  • db.collection.find();
  • 返回一个集合中文档的子集,子集的 范围从 0 个文档到整个集合;
  • db.collection.findOne();
  • 返回筛选的一个文档;

指定返回键

  • 设置第二参数,在第一参数筛选后的文档中只返回第二参数设置的键值;默认包含_id
  • 也可以在第二参数中设置_id: 0去掉_id;
//返回name,age,_id
db.test.find({}, {name: 1, age: 1}); //去掉_id
db.test.find({}, {name: 1, age: 1, _id: 0});

查询条件

  • $lt : <;
  • $lte: <=;
  • $gt: >;
  • $gte: >=;
  • $ne: !=;
db.users.find({"age" : {"$gte" : 18, "$lte" : 30}})

OR查询

  • 使用$in来查询一个键匹配的多个值;
  • 使用$nin来查询一个键不匹配的多个值;
  • 使用$or查询多个键中查询任意的给定值;
  • 使用$and查询多个键中同时匹配的给定值;
  • 使用$not: 取反,可以用在任何其他条件之上;
db.users.find({"user_id" : {"$in" : [12345, "joe"]})

//
db.raffle.find({"ticket_no" : {"$nin" : [725, 542, 390]}}) //查询ticket_no=725或winner=true的元素;
db.raffle.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]}) //
db.users.find({"$and" : [{"x" : {"$lt" : 1}}, {"x" : 4}]}) //
db.raffle.find({"ticket_no" : {"$not": {"$nin" : [725, 542, 390]}}})

特定数值查询

  • $mod: 取模运算,查询的值除以第一个给定值,若余数等于第二个给定值则匹配成功;
db.users.find({"id_num" : {"$mod" : [5, 1]}})

条件语句

  • 条件语句是内层文档的键,而修改器则是外层文档的键;
  • 一个键可以有任意多个条件,但是一个键不能对应多个更新修改器;
  • 有一些“元操作符”(meta-operator)也位于外层文档中,比如$and,$or$nor;

查询特定类型

  • null: 直接查询还会匹配不包含这个键的文档,可以通过$exists条件判定键值已存在;
db.c.find({"z" : {"$in" : [null], "$exists" : true}})
  • 正则表达式:MongoDB 使用 Perl 兼容的正则表达式(PCRE)库来匹配正则表达式;
db.users.find({"name" : /joey?/i})

查询数组: 与查询标量值是一样的;

  • $all:与$in不同,查询一个键同时匹配的多个值;
  • 查询数组特定位置的元素,需使用 key.index 语法指定下标;
  • $size: 查询特定长度的数组;并不能与其他查询条件组合使用,但是这种查询可以通过在文档中添加一个size键的方式来实现;每一次向指定数组添加元素时,同时增加size的值;
  • $slice: 指定find的第二个参数,指定需要返回的键;表示特定的范围;
  • 在不知道元素下标时希望返回与查询条件 相匹配的任意一个数组元素,使用$操作符得到一个匹配的元素;

    * 使用$elemMath 同时使用查询条件中的两个语句与 一个数组元素进行比较;但不会匹配非数组元素;
  • 可以使用min()max()将查询条件遍历的索引范围限制为$gt$lt的值;在可能包含数组的文档上应用范围查询时使用更好;
db.foot.find({"fruit" : {"$all" : ["apple", "banana"]});

//
db.food.find({"fruit" : {"$size" : 3}}); //返回博客评论的后10条;
db.blog.posts.findOne(criteria, {"comments" : {"$slice" : -10}}) //返回24~33的元素;
db.blog.posts.findOne(criteria, {"comments" : {"$slice" : [23, 10]}}) //
db.blog.posts.find({"comments.name" : "bob"}, {"comments.$" : 1}); //
db.test.find({"x" : {"$elemMatch" : {"$gt" : 10, "$lt" : 20}}); //
db.test.find({"x" : {"$gt" : 10, "$lt" : 20}).min({"x" : 10}).max({"x" : 20});
  • 查询内嵌文档:可以使用点表示法查询内嵌文档的键:
db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"})

$where查询

  • 当使用键 / 值方式无法满足时,可以使用$where,可以在查询中执行任意的 JavaScript;
  • 不是非常必要时,一定要避免使用$where查询,因为它们在速度上要比常规 查询慢很多;
  • 每个文档都要从BSON转换成JavaScript对象,然后通过$where表达式来运行;
//返回两个键具有相同值的文档

db.foo.find({"$where" : function () {
for (var current in this) {
for (var other in this) {
if(current != other && this[current] == this[other]) {
return true;
}
}
}
return false;
}});
  • 可以在运行mongod时指定--noscripting选项,完全关闭JavaScript的执行;

游标

  • 可以限制结果的数量,略过部分结果,根据任意键按任意顺序的 组合对结果进行各种排序,或者是执行其他一些强大的操作;
  • 调用find时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发 送查询,这样在执行之前可以给查询附加额外的选项;

hasNext, next方法

var cursor = db.collection.find();
while (cursor.hasNext()) {
obj = cursor.next();
// do stuff
}

limit,skip方法

  • 避免使用skip略过大量结果,因为先查找后过滤;
  • 不用skip对结果分页;
  • 不用skip随机选取文档;最好的方法是插入文档时给每个文档都添加一个额外的随机键;
//指定限制个数上限
db.c.find().limit(3); //跳过最先匹配的3个
db.c.find().skip(3);

sort:

  • 接受一组键 / 值对,键对应文档的键名,值代表排序的方向。
  • 排序方向1(升序)或者

    mongodb学习04 操作详解(2)的更多相关文章

    1. mongodb学习03 操作详解

      插入文档 db.test.insert({"name":"jinks"}); 批量插入 db.test.insert([{}, {}, {}]); 一次批量插入 ...

    2. mongodb学习05 操作详解(3)

      高级查询选项 //简单查询 var cursor = db.foo.find({"foo" : "bar"}) //封装查询 var cursor = db.f ...

    3. MongoDB各种查询操作详解

      这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

    4. js学习--DOM操作详解大全一(浏览器对象)

      一.客户端中的window对象 window对象表示当前浏览器的窗口,它是一个顶级对象,我们创建的所有对象.函数.变量都是window对象的成员. window对象自带了一些非常有用的方法.属性. w ...

    5. js学习--DOM操作详解大全 前奏(认识DOM)

      一 . 节点属性 DOM 是树型结构,相应的,可以通过一些节点属性来遍历节点树: 方法 说明 nodeName 节点名称,相当于tagName.属性节点返回属性名,文本节点返回#text.nodeNa ...

    6. js学习--DOM操作详解大全二(window对象)

      一.window - 计时器 1、setTimeout()可以用来在指定的时间之后单次调用函数.setTimeount(f,1000);//一秒后调用函数fclearTimeout();取消函数的执行 ...

    7. 从51跳cortex-m0学习2——程序详解

      跳cortex-m0——思想转变>之后又一入门级文章,在此不敢请老鸟们过目.不过要是老鸟们低头瞅了一眼,发现错误,还请教育之,那更是感激不尽.与Cortex在某些操作方式上的异同,让自己对Cor ...

    8. MySQL 操作详解

      MySQL 操作详解 一.实验简介 本节实验中学习并实践 MySQL 上创建数据库.创建表.查找信息等详细的语法及参数使用方法. 二.创建并使用数据库 1. 创建并选择数据库 使用SHOW语句找出服务 ...

    9. Hadoop深入学习:MapTask详解

      转自:http://flyingdutchman.iteye.com/blog/1878775#bc2337280 Hadoop深入学习:MapTask详解 博客分类: Hadoop MapTask执 ...

    随机推荐

    1. Mysql 基础 高级查询

      在西面内容中    car  和  nation   都表示 表名 1.无论 高级查询还是简单查询   都用  select.. from..语句   from  后面 加表名  可以使一张表也可以是 ...

    2. EF查询视图只得到一条记录

      1.出错结果:数据库表视图有多条数据,在使用EF框架进行查询时却只得到一条数据(注:拦截EF得到的sql语句在数据库进行查询并没有任务问题). 2.出错原因:该视图中没有ID或者主键,EF查询时进行反 ...

    3. POJ 1753 Flip game ( 高斯消元枚举自由变量)

      题目链接 题意:给定一个4*4的矩阵,有两种颜色,每次反转一个颜色会反转他自身以及上下左右的颜色,问把他们全变成一种颜色的最少步数. 题解:4*4的矩阵打表可知一共有四个自由变元,枚举变元求最小解即可 ...

    4. ajax基础语法、ajax做登录、ajax做用户名验证是否可用、ajax做关键字查询动态显示、ajax做用表格显示数据并增加操作列

      AJAX: AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.   ...

    5. Hibernate单向多对一对象关系模型映射

      单向的many-to-one 案例: 班级和学生 父亲和子女 单向:只能由其中一方维护关系 Many-to-one中有many的一方法维护或者体现两者之间的关系. 单向的many-to-one描述学生 ...

    6. [Android Pro] synchronized与static synchronized 的区别

      reference to :  http://www.cnblogs.com/shipengzhi/articles/2223100.html 1.synchronized与static synchr ...

    7. 《Thinking in Java》十七章_容器深入研究_练习13(Page484)

      练习13: 单词计数器 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFou ...

    8. ssh -v root@xxxxx 显示登录的细节

      [root@ok .ssh]# ssh -v root@10.100.2.84 OpenSSH_5.3p1, OpenSSL Feb debug1: Reading configuration dat ...

    9. javascript - 浏览器对象

      Navigator对象 弹出窗口 Cookies Browser Objects 参考手册 参考手册描述了每个对象的属性和方法,并提供了在线实例. Window 对象 Navigator 对象 Scr ...

    10. 大话数据结构–1.基础知识+2.算法

        2.算法: 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每个指令表现为一个或多个操作. 特性:输入.输出.有穷性.确定性.可行性.   2.9.1.算法时间复杂度: 语句 ...