`
Jerry__xie
  • 浏览: 15816 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

MongoDB 查询(2)

 
阅读更多
Mongodb 查询 (2)2011-12-12 10:52Mongodb 查询



查询嵌入的document



查询嵌入的整个document和普通的查询没有差别,比如我们有这样一个document



{

  "name" : {

    "first" : "Joe",

    "last" : "Schmoe"

  },

  "age" : 45

}

那么我们就可以这样查询名字叫Joe Schmoe的人



> db.people.find({"name" : {"first" : "Joe", "last" : "Schmoe"}})

如果Joe要加一个middle name,这个查询就不行了,这种查询必须匹配整个嵌入的document,而且key是有顺序的。



我们可以用.来直接查询嵌入的key。



> db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"})

点号在查询用document里就被解释为“通向嵌入的document”,所以document的key里边不能包含点号。



$where 查询



$where子句允许你在查询里执行arbitary javascript,使你几乎可以在查询中做任何事情。



最常见的例子就是比较document里边两个key的值。举个例子,我们有个list,我们想返回里边的key的值里有相等的document



(随便哪两个key,只要它们的value相等即可)。



> db.foo.insert({"apple" : 1, "banana" : 6, "peach" : 3})

> db.foo.insert({"apple" : 8, "spinach" : 4, "watermelon" : 4})

第二个document里,菠菜和西瓜的值是相等的,这个应该返回,这个使用$条件查询符号是做不到的。



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

... }});

如果函数返回true,那么这个document就会作为结果集的一部分被返回。



刚才我们定义了一个函数,给$where查询指定一个字符串是一样的效果



> db.foo.find({"$where" : "this.x + this.y == 10"})

> db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"})

这两个查询是等价的。



如非必要,尽量不要使用$where查询,$where查询比一般的查询慢很多,每个document都必须从BSON转换为一个javascript对象,



然后执行$where表达式。而且,索引也不能使用。你可以通过组合使用$where查询和非$where查询来降低使用它的代价。



4.游标



find方法使用游标返回查询结果,游标的客户端实现使你可以对最终结果做很多的控制。在shell里创建一个游标很简单,往collection里放些document,



执行查询,将返回结果指派给一个本地变量即可。



> for(i=0; i<100; i++) {

... db.c.insert({x : i});

... }

> var cursor = db.collection.find();

你可以使用next方法来遍历结果,使用hasNext方法来检查有没有下一个,典型的循环如下



> while (cursor.hasNext()) {

... obj = cursor.next();

... // do stuff

... }

cursor类同样实现了iterator接口,所以你可以使用forEach循环



> var cursor = db.people.find();

> cursor.forEach(function(x) {

... print(x.name);

... });

adam

matt

zak

当你调用find方法的时候,shell并不会立刻去查询数据库,直到你真正请求结果的时候才发送查询,这样你可以在实际执行查询之前



追加一些其他的选项,游标的这些方法几乎都是返回游标本身,所以你可以按任意顺序链入这些方法,下边三个查询是等价的



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

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

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

在这个时候查询并未执行,所有的函数都只是构建查询。现在我们调用hasNext方法,



> cursor.hasNext()

这时候查询被送到服务器,shell就立刻取到了前100条结果或者前4MB的结果,所以接下来在调用next方法的时候就不会再发送请求



以及接受结果,当第一次返回的结果集用完的时候,shell会再次联系服务器,请求更多的结果。



Limits, Skips, 和Sorts



limit函数限制返回的结果集的上限,如,只返回3个结果



> db.c.find().limit(3)

skip函数跳过前x个结果,返回剩余的



> db.c.find().skip(3)

sort方法使用一组键值对做参数,key是document里的key的名字,value是1升序或者-1降序。



如,按名字升序和年龄降序排序



> db.c.find().sort({username : 1, age : -1})

比较顺序



mongoDB有一个关于各种数据类型之间比较的等级制度。在某些情况下,你可能有一个key,它的值有多种类型,如果你想按照该



key排序,mongoDB有一个预定义好的顺序,它们从小到大分别为:



  1. Minimum value

  2. null

  3. Numbers (integers, longs, doubles)

  4. Strings

  5. Object/document

  6. Array

  7. Binary data

  8. Object ID

  9. Boolean

  10. Date

  11. Timestamp

  12. Regular expression

  13. Maximum value



获取一致性的结果



处理数据的常见方式就是从mongoDB里取出来,然后修改它,再存储进mongoDB,如下:




cursor = db.foo.find();



while (cursor.hasNext()) {

  var doc = cursor.next();

  doc = process(doc);

  db.foo.save(doc);

}

结果集数量很小的时候,这样子做是没问题的,如果结果集很大,这个做法就行不通了。



想象一下document是如何存储的,你可以像下图4-1一样来理解存储document的collection,每个雪花代表一个document,因为



它们和document一样,都很漂亮而且独一无二。


图4-1


现在,我们执行一个find,它从头开始向右返回结果。程序获取前100个document并处理它们,然后将它们存储回数据库,如果一个


document没有足够的空间来容纳新的document,如图4-2,那么就需要给它重新指定存储位置。通常,这个新的document 会重新

定位到collection的尾部,如图4-3.



图4-2


图4-3

现在,我们的程序持续不断地批量获取document,当它到达collect尾部的时候,那些被重新定位的document会再次返回,如图4-4.


图4-4


这个问题的解决办法是,对查询使用snapshot,如果添加了“$snapshot"选项,查询就会按照collection未被改变的视图运行。

本文来自: Prosurfer的博客
http://hi.baidu.com/prosurfer/blog/item/e8ee5e2ce1e4b6f28a1399f3.html
分享到:
评论

相关推荐

    MongoDB查询练习题及答案

    在本题中,我们将探讨 MongoDB 的查询操作,基于提供的 `user1` 和 `user2` 文档进行练习。 首先,让我们熟悉一下 `db.users.drop()` 命令。这个命令用于删除集合 `users`,如果存在的话。在 MongoDB 中,集合是...

    mongoDB-查询语法

    MongoDB 查询语法详解 MongoDB 是一个基于NoSQL的数据库,具有高效、灵活、易扩展等特点。在 MongoDB 中,查询语法是非常重要的一部分,本文将对 MongoDB 的查询语法进行详细的介绍。 基本查询语法 在 MongoDB 中...

    mongodb查询工具Studio3T

    如果您不习惯MongoDB查询语言,那么Studio3T的SQL查询可能会派上用场。编写SQL选择表达式和SQL联接来查询mongodb,并查看SQL查询如何转换为MQL——这是一个很好的工具。SQL查询语言

    Thinkphp使用mongodb数据库实现多条件查询方法

    在Thinkphp中使用MongoDB进行多条件查询时,需要对框架提供的驱动进行一定的修改以适应MongoDB的查询方式。 在Thinkphp中实现多条件查询时,可以使用框架提供的查询构建器(Query Builder),但是当涉及到MongoDB的...

    MongoDB高级查询用法大全

    MongoDB 高级查询用法大全 MongoDB 作为一个 NoSQL 数据库,提供了多种高级查询方式,以下是 MongoDB 高级查询用法大全: 一、比较运算符 在 MongoDB 中,比较运算符用于比较字段的值,常用的比较运算符有: * $...

    MongoDB查询性能验证及优化

    本文将深入探讨如何验证MongoDB查询性能并进行优化。 首先,我们需要理解MongoDB的查询机制。MongoDB使用查询解释器来解析和执行查询操作。通过`explain()`方法,我们可以获取查询的执行计划,包括扫描的文档数量、...

    mongodb查询数据返回JSP

    mongodb查询数据,显示DBCursor.next这种形式,那如何把值带到JSP显示呢? 上传的是一个项目Demo,导入可以直接运行,当然也可以直接查看其中的代码。 项目是使用jquery.ajax显示后台返回的Json串。 若再详细了解...

    MONGOdb视频教程地址.txt

    真实有效的mongodb视频教程地址 深入浅出 MongoDB 高清IT教程视频下载 1.1、-nosql与MongoDB.mp4 1.2、-MongoDB安装配置.mp4 1.3、-MongoDB?... 2.3、_MongoDB查询语法2.mp4 2.4、-MongoDB查询语法3.mp4

    五、MongoDB 学习PPT

    插入文档可以通过`db.collection.insert()`或`db.collection.insertMany()`完成,查询则可以使用丰富的查询语言,包括基本查询、聚合框架和正则表达式匹配等。修改文档可以使用`db.collection.update()`,删除文档则...

    1亿条记录的MongoDB数据库随机查询性能测试

    在测试脚本`mselectmongodb.py`中,定义了一个`SqlToMongo`类,包含了执行MongoDB查询的方法`m_sql()`。`gen_load()`函数用于启动每个进程,并调用`m_sql()`执行随机查询。在主程序中,创建了一个包含101个进程的...

    《MongoDB实战》第2版-第5章-Mongodb查询1

    本章主要内容包括理解查询一个电子商务数据模型、MongoDB查询语言的细节、查询选择器及其选项。 MongoDB查询语言不同于传统的SQL,而是采用类JSON的查询语法。书中通过实际的电子商务场景来解释查询操作,如商品、...

    mongodb查询性能.rar

    首先,我们要了解MongoDB查询的基本原理。MongoDB使用查询解释器来解析查询语句,并生成执行计划。执行计划决定了数据如何被检索,包括使用的索引、数据读取顺序等。你可以通过`db.collection.explain()`方法来查看...

    MongoDB查询指定域语言Rogue.zip

    一个是用Scala编写的MongoDB查询指定域语言 示例代码: val query = Venue where (_.venuename eqs "Starbucks")query.count()query.countDistinct(_.mayor)query.fetch()query.fetch(n)query.get() // equivalent...

    mongodb管理工具

    - 查询构建器:帮助用户构建和执行MongoDB查询语句。 - 监控工具:显示服务器状态,如内存使用、磁盘空间和操作统计等。 在实际工作中,根据需求和环境,开发者和DBA可能会选择其中一个或两者结合来管理MongoDB...

    idea mongodb插件

    4. 查询执行:在IDEA内直接编写和执行MongoDB查询语句,实时查看结果,支持复杂的聚合框架操作。 5. 脚本执行:支持运行JavaScript脚本,对数据库进行更复杂的操作。 6. 导入导出:可以将数据导入或导出为JSON、CSV...

    MongoDB的安装文件,补丁以及可视化工具

    Spring Data MongoDB是一个强大的库,简化了在Spring应用中使用MongoDB的过程,提供了对CRUD操作的抽象,以及数据映射和查询构造等功能。 压缩包中的可视化工具对于数据库管理员来说是极其有用的。这些工具通常具有...

    java MongoDB查询数据导出为excel表格

    1.java连接mongo数据库查询统计信息导出为excel表格 2.所有连接参数都可以动态输入,参数包括:ip、端口、数据库名称、集合名称、查询参数(公众号,写在指定文件中),导出表格存放位置

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    它是MongoDB操作的抽象层,封装了大量的CRUD(创建、读取、更新、删除)操作,以及更复杂的查询和聚合功能。在`App.java`中,你可以看到如何初始化和使用`MongoDBTemplate`。通常,你需要通过`ApplicationContext`...

Global site tag (gtag.js) - Google Analytics