本文主要介绍内容:从MongoDB中请求数据的不同的方法

Note:All of the examples in this document use the mongo shell interface. All of these operations are available in an idiomatic interface for each language by way of the MongoDB Driver. See your driver documentation for full API documentation.

Queries in MongoDB 查询

 find()

主要有find()和findOne()两种查询的方法,find()具体语法如下:

  db.collection.find( <query>, <projection> )

All queries in MongoDB address a single collection. 所有查询操作都在一个集合中进行。
ps:可以在数据库打开后,键入db指令,查看当前的数据库;键入show collections 查看所有的集合。

其中<query>限制查询筛选条件,如果为空,则返回所有的文档(documents)。
<projection>限制返回的查询结果的域。

findOne()
findOne()不同之处:返回值类型为一个文档而不是游标(类似指针)。

具体语法如下:
db.collection.findOne( <query>, <projection> )

Query Document
下面看一些<query>的例子:

   db.inventory.find( { type: 'food', price: { $lt: 9.95 } }, { item: 1, qty: 1 } )
在inventory集合中,查找type为food,price少于9.95的文档,返回这些文档的item和qty以及_id。该函数返回值类型为游标。
db.inventory.find({}) 查询集合中的所有文档,也能写成edb.inventory.find()。
db.inventory.find( { type: { $in: [ 'food', 'snacks' ] } } )筛选集合中type值为food或snacks的文档。

db.inventory.find( { $or: [ { qty: { $gt: 100 } },
                            { price: { $lt: 9.95 } } ]
                   } )筛选qty大于100或者price小于9.95的记录。
同一个域中的“或” 使用$in表示,不同域之间的“或”使用$or表示。

筛选子文档:
db.inventory.find( {
                     producer: {
                                 company: 'ABC123',
                                 address: '123 Street'
                               }
                   }
                 )
上面的例子可以使用点符号简化,如下:
db.inventory.find( { 'producer.company': 'ABC123' } )

筛选第一个子文档by域为shipping的所有的文档
db.inventory.find( { 'memos.0.by': 'shipping' } )

筛选至少有一个子文档by域为shipping的所有的文档
db.inventory.find( { 'memos.by': 'shipping' } )

Result Projections
下面看一些<projection>的例子:

结果包含item和qty域以及默认的_id域:
db.inventory.find( { type: 'food' }, { item: 1, qty: 1 } )

排除结果中默认的_id域:
db.inventory.find( { type: 'food' }, { item: 1, qty: 1, _id:0 } )

 
高级查询的补充知识:
摘自http://www.cnblogs.com/zhy4606/archive/2011/09/13/2175220.html
$all 匹配所有

这个操作符跟SQL语法的in类似,但不同的是, in只需满足( )内的某一个值即可,  而$all必须满足[ ]内的所有值,例如:
db.users.find({age : {$all : [6, 8]}});  
可以查询出  {name: 'David', age: 26, age: [ 6, 8, 9 ] }  
但查询不出  {name: 'David', age: 26, age: [ 6, 7, 9 ] }

$exists 判断字段是否存在

查询所有存在age字段的记录  
db.users.find({age: {$exists: true}});  
查询所有不存在name字段的记录  
db.users.find({name: {$exists: false}});
 
Null 值处理

> db.c2.find({age:null})

$mod 取模运算

查询age取模6等于1的数据
db.c1.find({age: {$mod : [ 6 , 1 ] } })

$ne 不等于
查询x的值不等于3 的数据
db.c1.find( { age : { $ne : 7 } } );

$in 包含
db.c1.find({age:{$in: [7,8]}});
 
$nin 不包含
查询age的值在7,8 范围外的数据 
db.c1.find({age:{$nin: [7,8]}});

$size 数组元素个数
对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录
匹配db.users.find({favorite_number: {$size: 3}});
不匹配db.users.find({favorite_number: {$size: 2}});

正则表达式匹配

查询name 不以T开头的数据
db.c1.find({name: {$not: /^T.*/}});

Javascript 查询和$Where查询
查询a大于3的数据,下面的查询方法殊途同归
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);

count 查询记录条数
db.users.find().count();
以下返回的不是5,而是user 表中所有的记录数量
db.users.find().skip(10).limit(5).count();
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
db.users.find().skip(10).limit(5).count(true);

skip限制返回记录的起点
从第3 条记录开始,返回5 条记录(limit 3, 5)
db.users.find().skip(3).limit(5);

Indexes索引

使用db.collection.ensureIndex()方法创建索引。
db.collection.ensureIndex( { <field1>: <order>, <field2>: <order>, ... } )

其中order选项,1表示升序,-1表示降序

The explain() cursor method allows you to inspect the operation of the query system, and is useful for analyzing the efficiency of queries, and for determining how the query uses the index.

db.inventory.find( { type: 'food' } ).explain()

可以通过查看描述,分析建立索引前后查询效率的变化。MongoDB使用B树建立索引。

Cursors游标

范例:
var myCursor = db.inventory.find( { type: 'food' } );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;

if (myDocument) {
    var myItem = myDocument.item;
    printjson(myItem);
}

或者使用javascript语法:
var myCursor =  db.inventory.find( { type: 'food' } );

myCursor.forEach(printjson);

游标在10分钟后会自动回收,如果想要去除时间限制,设置如下:
var myCursor = db.inventory.find().addOption(DBQuery.Option.noTimeout);

Cursor Flags

mongo shell提供了以下cursor flags:

DBQuery.Option.tailable
    DBQuery.Option.slaveOk
    DBQuery.Option.oplogReplay
    DBQuery.Option.noTimeout
    DBQuery.Option.awaitData
    DBQuery.Option.exhaust
    DBQuery.Option.partial

集合操作(aggregation)

包括以下四种:
    count (count())
    distinct (db.collection.distinct())
    group (db.collection.group())
    mapReduce. (Also consider mapReduce() and Map-Reduce.)

从Sharded Clusters中读取数据

从Replica Sets中读取数据

MongoDB—— 读操作 Core MongoDB Operations (CRUD)的更多相关文章

  1. MongoDB—— 写操作 Core MongoDB Operations (CRUD)

    MongoDB使用BSON文件存储在collection中,本文主要介绍MongoDB中的写操作和优化策略. 主要有三种写操作:        Create        Update        ...

  2. NoSql数据库初探-mongoDB读操作

    MongoDB以文档的形式来存储数据,此结果类似于JSON键值对.文档类似于编程语言中将键和值关联起来的结构(比如:字典.Map.哈希表.关联数组).MongoDB文档是以BOSN文档的形式存在的.B ...

  3. .Net Core MongoDB 简单操作。

    一:MongoDB 简单操作类.这里引用了MongoDB.Driver. using MongoDB.Bson; using MongoDB.Driver; using System; using S ...

  4. MongoDB 读偏好设置中增加最大有效延迟时间的参数

    在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上.现在绝大部分MongoDB驱动支持读偏好设置(read pr ...

  5. 笔记-mongodb数据操作

    笔记-mongodb数据操作 1.      数据操作 1.1.    插入 db.COLLECTION_NAME.insert(document) 案例: db.inventory.insertOn ...

  6. MongoDB via Dotnet Core数据映射详解

    用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事.   一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...

  7. MongoDB常用操作一查询find方法db.collection_name.find()

    来:http://blog.csdn.net/wangli61289/article/details/40623097 https://docs.mongodb.org/manual/referenc ...

  8. mongodb高级操作及在Java企业级开发中的应用

    Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...

  9. [置顶] MongoDB 分布式操作——分片操作

    MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...

随机推荐

  1. 一起买beta版模块单元测试

    一起买beta版模块接口单元测试 测试目的 保证代码质量,对各个模块进行单元测试,不仅可以有效地保证代码的可靠性,让模块在与别的模块整合时出现更少的错误. 而且不用每次启动程序而等待浪费时间. 单元描 ...

  2. POJ 2892 Tunnel Warfare

    传送门 很神奇的一道题,可以用线段树搞,为了练习treap所以拿treap写了. 其实根据询问,删除那个标号就加入平衡树,然后找到最大的和最小的就好了. 一些很烦人的小细节. //POJ 2892 / ...

  3. elk系列2之multiline模块的使用

    preface 上回说道了elk的安装以及kibana的简单搜索语法,还有logstash的input,output的语法,但是我们在使用中发现了一个问题,我们知道,elk是每一行为一个事件,像Jav ...

  4. HDU1698Just a Hook(线段树 + 区间修改 + 求和)

    题目链接 分析:1-N区间内初始都是1,然后q个询问,每个询问修改区间[a,b]的值为2或3或者1,统计最后整个区间的和 本来想刷刷手速,结果还是写了一个小时,第一个超时,因为输出的时候去每个区间查找 ...

  5. JavaWeb---总结(七)HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...

  6. 和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)

    转自http://blog.csdn.net/bluishglc/article/details/7585965 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统 ...

  7. 【C++11】新特性——auto的使用

    [C++11]新特性——auto的使用 C++11中引入的auto主要有两种用途:自动类型推断和返回值占位.auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后 ...

  8. 北斗/GPS

    北斗/GPS都是用的nmea通用协议. NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA.$GPGSA.$GPGSV.$GPRMC.$GPVTG.$GPGLL等 ...

  9. webuploader横向按钮样式

    #picker{display: inline-block;line-height: 1.428571429;vertical-align: middle;margin: 0 12px 0 0;wid ...

  10. Orchard源码分析(7):ASP.NET MVC相关

    概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展.主 ...