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

MongoDB 查询(1)

 
阅读更多
Mongodb 查询(1)2011-12-12 10:531.find方法介绍

在不传入参数的情况下,find方法缺省使用{}做参数,它匹配所有的document。

我们可以传入一个查询document给find方法来限制输出,如:查找年龄为27的用户

> db.users.find({"age" : 27})

一个查询document里可以包括多个条件,如:查询年龄为27并且名字叫joe的用户

> db.users.find({"username" : "joe", "age" : 27})

条件之间都是And关系。

指定查询返回的内容

有时候我们并不需要返回document里所有的key/value对,我们可以给find(或findOne)方法传入第二个参数来指定返回哪些key的值。

比如:我们只想要用户的名字和Email

> db.users.find({}, {"username" : 1, "email" : 1})

{

  "_id" : ObjectId("4ba0f0dfd22aa494fd523620"),

  "username" : "joe",

  "email" : "joe@example.com"

}

"_id"键总是会被返回。

如果想指定不想返回的key,如:返回除了fatal_weakness以外的key的值

> db.users.find({}, {"fatal_weakness" : 0})

用这个方法可以把缺省返回的"_id"给排除掉

> db.users.find({}, {"username" : 1, "_id" : 0})

{

"username" : "joe",

}

限制

查询document里边key的值对数据库来说必须是个常量,假如collection里边有两个key,一个叫int_stock一个叫num_sold,

如果我们想查询这两个key相等的document,下边的查询是行不通的

> db.stock.find({"in_stock" : "this.num_sold"}) // doesn't work

2.查询条件

"$lt", "$lte", "$gt", 和"$gte"分别对应<,<=,>,>=

“$ne" 不等于

"$in"和sqlserver的in差不多意思

"$nin”就是not in了

"$or" 是多字段间的条件关联与sqlserver的or 一样

如:查询年龄在18到30之间的用户

> db.users.find({"age" : {"$gte" : 18, "$lte" : 30}})

“$ne" 不等于,可以用于任意类型的数据

如,查找名字不叫joe的用户

> db.users.find({"username" : {"$ne" : "joe"}})

OR查询

mongoDB里有两种使用OR的方法,如果是一个key对应的多个值,可以用"$in",还有个”or"是一种更通用的方法。

如:我们在进行一个抽奖活动,ticket No是725,542,390的三个中奖了,我们可以这样把这三个document查出来

> db.raffle.find({"ticket_no" : {"$in" : [725, 542, 390]}})

"$in"里边指定的值可以是不同的数据类型

与"$in"相反的操作就是"$nin”,返回指定的key的值不存在于数组里边的document,



> db.raffle.find({"ticket_no" : {"$nin" : [725, 542, 390]}})

上边的查询返回没中奖的所有ticket。

如果要在多个key的查询条件之间建立Or关系就得用"$or",如,查询彩票号码为725, 542, 390  或者winner为true的document

> db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725, 542, 390]}},{"winner" : true}]})

$not



"$not"可以应用于上边说的所有的条件操作符上,举个例子之前我们先看下求余(取模)操作符"$mod","$mod"指定一个整数数组做为key的值,



里边两个数字,第一个是对其求余的数字,第二个是余数。比如,我们要找id_num的值对5求余,余数为1的document



> db.users.find({"id_num" : {"$mod" : [5, 1]}})

现在我们使用$not,如果找id_num对5求余后余数不为1的document



> db.users.find({"id_num" : {"$not" : {"$mod" : [5, 1]}}})

规律



回头再看下前一章的更新修饰符,就会发现同样是$打头的符号,它和本章说的查询条件符号的位置是不一样的,



在查询里,"$lt"属于内层document,而更新的时候"$inc"是外层document的key。



一个key上可以有多个查询条件,却不能有多个更新。



查询年龄为20到30的用户可以这样做



> db.users.find({"age" : {"$lt" : 30, "$gt" : 20}})

但是却没有下边这种更新修饰符



{"$inc" : {"age" : 1}, "$set" : {age : 40}}

3.特殊类型查询



null



null同时匹配自身和不存在的key,



> db.c.find()

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }

{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }

如果要查找y为null的document



> db.c.find({"y" : null})

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }

查找key为null的document时,缺少此key的所有document也会返回



> db.c.find({"z" : null})

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }

{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }

{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }

如果想查找key存在并且为null的document,就要用"$exists"符号,



> db.c.find({"z" : {"$in" : [null], "$exists" : true}})

这个办法看起来比较笨,没办法,我们没有"$eq"条件符号。



正则表达式



查找名字叫joe,但是忽略大小写的document



> db.users.find({"name" : /joe/i})

mongoDB使用Perl Compatible Regular Expression (PCRE)来匹配正则表达式,所有PCRE允许的语法都可以在mongoDB里使用。



查询数组



查询数组很简单,通常情况下,数组的每个元素的值都能看作key的值。



例如,我们有一些水果



> db.food.insert({"fruit" : ["apple", "banana", "peach"]})

我们查找水果里有香蕉的ducoment



> db.food.find({"fruit" : "banana"})

用起来就好像我们有这么一个document在



{"fruit" : "apple","fruit" : "banana", "fruit" : "peach"}

当然,上边这个document是不合法的。



$all



如果要匹配数组里的多个元素,就要用“$all”。



例如,我们有这样一个collection



> db.food.insert({"_id" : 1, "fruit" : ["apple", "banana", "peach"]})

> db.food.insert({"_id" : 2, "fruit" : ["apple", "kumquat", "orange"]})

> db.food.insert({"_id" : 3, "fruit" : ["cherry", "banana", "apple"]})

要查询既有apple又有banana的document



> db.food.find({fruit : {$all : ["apple", "banana"]}})

{"_id" : 1, "fruit" : ["apple", "banana", "peach"]}

{"_id" : 3, "fruit" : ["cherry", "banana", "apple"]}

$all的值里边的元素是没有顺序的,只要目标包含里边的每个元素即可,如果不使用$all,就会执行精确的匹配检查。



> db.food.find({"fruit" : ["apple", "banana", "peach"]})

上边这个查询会匹配第一个document



> db.food.find({"fruit" : ["apple", "banana"]})

这个查询就不会匹配第一个document



> db.food.find({"fruit" : ["banana", "apple", "peach"]})

同样,这个查询也不会匹配第一个document



如果要匹配数组里指定的元素,就要使用key.index这种语法



> db.food.find({"fruit.2" : "peach"})

index 是从0开始索引的



$size



按照数组中元素的个数查询



> db.food.find({"fruit" : {"$size" : 3}})

$size 不能和比较条件符号(如$gt)联合使用



$slice操作符



上边曾经提到过,使用find方法的第二个参数,指定哪些键值会被返回,$slice操作符可以返回数组元素的一个子集。



例如,查找博客和它的前10条评论



> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : 10}})

或者,如果想要后10条评论的话



> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : -10}})

也可以返回中间的一段结果



> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : [23, 10]}})

上边的查询跳过前23个元素,返回第24个到第34个元素。

本文转载百度空间博客rosurfer
http://hi.baidu.com/prosurfer/blog/item/07a8037be83464ea0ad187fc.html
分享到:
评论

相关推荐

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

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

    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()`方法,我们可以获取查询的执行计划,包括扫描的文档数量、...

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

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

    mongodb查询数据返回JSP

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

    五、MongoDB 学习PPT

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

    MONGOdb视频教程地址.txt

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

    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查询性能.rar

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

    idea mongodb插件

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

    mongodb管理工具

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

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

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

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

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

    MongoDB查询分析.pdf

    在某些复杂的查询场景中,尽管MongoDB的查询优化器通常能做出正确的选择,但使用`hint()`可以进一步优化查询路径。例如,如果你知道查询应优先基于`gender`和`user_name`字段,可以使用以下代码: ```javascript db...

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

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

Global site tag (gtag.js) - Google Analytics