`
kanny87929
  • 浏览: 17514 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MongoDB 查询

阅读更多
4.1 find简介
> db.c.find()


将返回集合c 中的所有内容。

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


4.1.1 指定返回的键

如果只对用户集合的"username" 和"email" 键感兴趣,可以使用如下查
询返回这些键:
> db.users.find({}, {"username" : 1, "email" : 1})
{
"_id" : ObjectId("4ba0f0dfd22aa494fd523620"),
"username" : "joe",
"email" : "joe@example.com"
}


也可以用第二个参数来剔除查询结果中的某个键/ 值对。例如,文档中有很多键,
但是不希望结果中含有"fatal_weakness" 键:
> db.users.find({}, {"fatal_weakness" : 0})

也可以用来防止返回"_id":
> db.users.find({}, {"username" : 1, "_id" : 0})
{
"username" : "joe",
}


4.1.2 限制

> db.stock.find({"in_stock" : "this.num_sold"}) // 不可行


4.2.1 查询条件

"$lt"、"$lte"、"$gt" 和"$gte" 就是全部的比较操作符,分别对应<、<=、>
和>=。
查询在18~30 岁(含)的用户,就可以像下面这样

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


例如,要查找在2007 年1 月1 日前注册的人,可以像下面这样:

> start = new Date("01/01/2007")
> db.users.find({"registered" : {"$lt" : start}})


对于文档的键值不等于某个特定值的情况,就要使用另外一种条件操作符"$ne" 了,
它表示“不相等”。若是想要查询所有名字不为“joe”的用户,可以像下面这样查询:

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


"$ne" 能用于所有类型的数据。

4.2.2 OR查询

MongoDB 中有两种方式进行OR 查询。"$in" 可以用来查询一个键的多个值。
"$or" 更通用一些,用来完成多个键值的任意给定值。

对于单一键要是有多个值与其匹配的话,就要用"$in" 加一个条件数组。例如,抽奖
活动的中奖号码是725、542 和390。要找出全部这些中奖数据,可以构建如下查询:

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


"$in" 非常灵活,可以指定不同的类型的条件和值。例如,在逐步将用户的ID 号
迁移成用户名的过程中,要做兼顾二者的查询:

> db.users.find({"user_id" : {"$in" : [12345, "joe"]}})


与"$in" 相对的是"$nin",将返回与数组中所有条件都不匹配的的文档。要是想
返回所有没有中奖的人,就可以用如下方法进行查询:

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


"$in" 能对单个键做OR 查询,但要是想找到"ticket_no" 为725 或者"winner" 为
true 的文档该怎么办呢?对于这种情况,应该使用"$or"。"$or" 接受一个包含所有
可能条件的数组作为参数。上面中奖的例子如果用"$or" 改写会是下面这个样子的:

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


"$or" 可以含有其他条件句。例如,如果想要将"ticket_no" 与那3 个值匹配上,
外加"winner" 键,就可以这么做:

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


4.2.3 $not

"$not" 是元条件句,即可以用在任何其他条件之上。例如,就拿取模运算符"$mod" 来
说。"$mod" 会将查询的值除以第一个给定值,若余数等于第二个给定值则返回该结果:

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


上面的查询会返回"id_num" 值为1、6、11、16 等的用户。但要是想返回"id_
num" 为2、3、4、5、7、8、9、10、12 等的用户,就要用"$not" 了:

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


"$not" 与正则表达式联合使用的时候极为有用,用来查找那些与特定模式不符的
文档

4.2.4 条件句的规则

要查找年龄为20~30 的所有用户,可以在"age"
键上使用"$gt" 和"$lt":

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


一个键可以有多个条件,但是一个键不能对应多个更新修改器。例如,修改器文档
不能同时含有{"$inc" : {"age" : 1}, "$set" : {age : 40}},因为修改
了"age" 两次。但是对于查询条件句就没有这种限定。

4.3 特定于类型的查询

4.3.1 null

null 就有点奇怪。它确实能匹配自身,所以要是有一个包含如下文档的集合:

> db.c.find()
{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }
{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }
{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }


就可以按照预期的方式查询"y" 键为null 的文档:

> db.c.find({"y" : null})
{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }


但是,null 不仅仅匹配自身,而且匹配“不存在的”。所以,这种匹配还会返回缺
少这个键的所有文档:

> db.c.find({"z" : null})
{ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }
{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }
{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }


如果仅仅想要匹配键值为null 的文档,既要检查该键的值是否为null,还要通过
"$exists" 条件判定键值已经已存在:

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


不幸的是,没有"$eq" 操作符,所以看上去有些费解,但是只有一个元素的"$in"
操作符效果是一样的。

4.3.3 查询数组

如果数组是一个水果清单,比如下面这样:

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


下面的查询:

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


会成功匹配该文档。这个查询好比我们用了一个如下的文档(不合法的)进行的查询:

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


1. $all
如果需要通过多个元素来匹配数组,就要用"$all" 了。这样就会匹配一组元素。
例如,假设创建包含3 个元素的如下集合:

> 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" 的文档,就得用"$all" 来查询:

> db.food.find({fruit : {$all : ["apple", "banana"]}})
{"_id" : 1, "fruit" : ["apple", "banana", "peach"]}
{"_id" : 3, "fruit" : ["cherry", "banana", "apple"]}


精确匹配对于有缺少或者冗余元素的情况
就不大灵了。例如,下面的方法会匹配之前的第一个文档:

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


但是下面这个就不会匹配:

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


这个亦不会匹配:

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


要是想查询数组指定位置的元素,则需使用key.index 语法指定下标,例如:

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


数组下标都是从0 开始的,所以上面的表达式会用数组的第3 个元素和"peach" 匹配。

分享到:
评论

相关推荐

    MongoDB查询练习题及答案

    MongoDB 是一种流行的 NoSQL 数据库,以文档型数据存储为主,支持丰富的查询表达能力。在本题中,我们将探讨 MongoDB 的查询操作,基于提供的 `user1` 和 `user2` 文档进行练习。 首先,让我们熟悉一下 `db.users....

    mongodb查询工具Studio3T

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

    mongoDB-查询语法

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

    MongoDB查询性能验证及优化

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

    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实战》第2版-第5章-Mongodb查询1

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

    一个简单的沙箱来测试和共享MongoDB查询.zip

    本压缩包"一个简单的沙箱来测试和共享MongoDB查询.zip"显然是为了提供一个环境,让用户能够安全地尝试和分享MongoDB查询,而不会影响到生产环境。 在“mongoplayground_dev.zip”中,很可能是包含了一个在线MongoDB...

    mongodb查询数据返回JSP

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

    idea mongodb插件

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

    mongodb管理工具

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

    MongoDB查询语言:分片处理

    MongoDB查询语言:分片处理

    MongoDB查询语言:备份与恢复

    MongoDB查询语言:备份与恢复

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

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

    MongoDB基本查询.pdf

    本篇资料主要涵盖了MongoDB的基本查询操作,包括查询数据、格式化输出、筛选特定文档以及使用比较运算符进行查询。 首先,MongoDB 中用于查询数据的核心命令是 `find`,正如题目中所提及的,其基本语法格式为 `db....

    MONGODB查询:使用MONGODB的电影数据库

    一、MongoDB查询基础 1. 查询文档:在MongoDB中,查询数据是通过`find()`方法实现的。例如,如果你想从"movies"集合中找到所有的文档,你可以使用以下命令: ```javascript db.movies.find(); ``` 2. 条件查询...

    MongoDB查询优化技术研究_葛宇锋.caj

    MongoDB查询优化技术研究_葛宇锋.caj

    sift.js, 使用mongodb查询筛选数组.zip

    sift.js, 使用mongodb查询筛选数组 使用mongodb查询验证对象的&筛选器数组 扩展文档 checkout http://docs.mongodb.org/manual/reference/operator/query/插件功能:Support

    node-monquery, 面向人类的mongodb查询语言.zip

    node-monquery, 面向人类的mongodb查询语言 monquerylucene为人类( 还有 ferrets ) 提供了基于字符串的mongodb查询语言。安装$ npm install monquery为什么?更好的搜索/日志过滤的用户体验编写JSON查

    mongo-queries:一些 MongoDB 查询

    在脚本中编译的一些 MongoDB 查询..如何运行脚本/秒: 运行 mongoDB 服务器: mongod --port 27017 导入json文档: mongoimport -db testing --collection people res/people.json --jsonArray 在本地运行脚本: ...

Global site tag (gtag.js) - Google Analytics