MongoDB的查询

MongoDB使用find来查询,不指定任何参数说明是对整个集合的文档查询。

  1. find查询

指定返回的键

有时并不需要将文档中所有键值对都返回,可以通过find(或者findOne)的第二个参数来制定想要的键,这样即会节省传输的数据量,又能节省客户端解码文档的时间和内存消耗。

例如:

> db.people.find()

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

>

如果只对name和age感兴趣,可以这样查询:

> db.people.find({"name":"joe","age":21})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

>

但是"_id"总是被返回,即便没有指定。

可以使用第二个参数来剔除查询结果中的某个键值对,例如,如果不希望显示"friends" : 32的键值对:

> db.people.find({},{"friends":0})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "enemies" : 2 }

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

>

也可以用来防止返回"_id":

> db.people.find({"age":21},{"_id":0})

{ "name" : "joe", "age" : 21 }

2、查询条件

查询不仅能精确匹配,还能匹配更加复杂的条件,比如范围,OR子句或者取反。

2.1、查询条件

查询条件的比较操作符:

"$lt"  对应 <

"$lte" 对应<=

"$gt"  对应>

"$gte" 对应>=

"$ne"  对应“不相等”

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

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

> db.people.find({"age":{"$ne":65}})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

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

2.1、OR查询

有两种方式进行OR查询。

"$in":可以用于查询一个键的多个值;

"$or":完成多个键值的任意给定值。

2.1.1"$in"

对于单一键要是有多个值与其匹配的话,就要用"$in"加一个条件数组:

> db.people.find({"age":{"$in":[21,49,65]}})

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

>

"$in"非常灵活,可以指定不同类型的条件和值:

> db.people.insert({"age":"kkk"})

WriteResult({ "nInserted" : 1 })

> db.people.find({"age":{"$in":[21,"kkk"]}})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

要是"$in"对应的数组只有一个值,那么和直接匹配这个值的效果是一样的。

> db.people.find({"age":{"$in":[21]}})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

> db.people.find({"age":21})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

>

2.1.1"$nin"

和"$in"相对的是"$nin",将返回与数组中所有条件都不匹配的文档:

> db.people.find({"age":{"$nin":[21,49,65]}})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

2.1.1"$or"

"$or"接受一个包含所有可能条件的数组作为参数:

> db.people.find({"$or":[{"age":"kkk"},{"friends":32}]})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

同时"$or"可以包含其他条件句:

> db.people.find({"$or":[{"age":"kkk"},{"friends":32},{"age":{"$in":[21,65]}}]})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

AND型的查询,总是尽可能地用最少的条件来限定结果的范围;而OR型的查询则相反,第一个条件尽可能地匹配更多的文档,这样才是最高效的。

时间: 2024-09-28 23:49:25

MongoDB的查询的相关文章

mongodb 模糊查询以及$type使用

mongodb 模糊查询以及$type使用 2012-09-11 14:13:30|  分类: mongodb |  标签: |举报 |字号大中小 订阅 最近有一监控业务,由于数据采集到非数字内容,导致监控图表无法正常显示,所以要找出这部分数据,进行删除,然后开发员从源头更正插入数据库的数据,不再产生非数字内容. 下面举一个例子: 建立测试数据: for(i=1;i<=100;i++){db.test.insert({id:i,content:"test content",nam

mongodb高级查询

MongoDB 的逻辑结构是一种层次结构.主要由文档(document).集合(collection).数据库(database)这三部分组成的.逻辑结构是面向用户的用户使用MongoDB 开发应用程序使用的就是逻辑结构. MongoDB 的文档document相当于关系数据库中的一行记录. 多个文档组成一个集合collection相当于关系数据库的表. 多个集合collection逻辑上组织在一起就是数据库database. 一个MongoDB 实例支持多个数据库database. mongo

mongodb并列查询

在mongodb的查询语句中可以这么写{"a":$gt(1),"a":$lt(5)} 但这么查询出来的值会做单个条件匹配,最终结果为a大于1的集合+a小于5的集合 如果需要实现去交集,a大于1并且又小于5,就必须要用到$and函数了 { $and:[{"_id":{$gte:ObjectId("59512f800000000000000000")}}, {"_id":{$lte:ObjectId("

mongodb慢查询记录

在 MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有,而且还有一些比MySQL的Slow Query Log更详细的信息.它就是我们这篇文章的主题. 开启 Profiling 功能 有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置. 启动MongoDB时加上–profile=级别 即可. 也可以在客户端调用db.setProfilin

Mongodb 条件查询

1.1 查询出所有数据的指定键(name ,age ,country) db.persons.find({},{name:1,age:1,country:1,_id:0}) 2.查询条件 2.查询条件 2.1查询出年龄在25到27岁之间的学生 db.persons.find({age: {$gte:25,$lte:27},{_id:0,age:1}) 2.2查询出所有不是韩国籍的学生的数学成绩 db.persons.find({country:{$ne:”Korea”}},{_id:0,m:1}

MongoDB各种查询操作详解

这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下 一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询. 1.查询全部 空的查询文档{}会匹配集合的全部内容.如果不指定查询文档,默认就是{}. 2.部分查询 3.键的筛选 键的筛选是查询时只返回自己感兴趣的键值,通过指定find的第二个参数来实现.这样可以节省传输的数据量,又能节省客户端解码文档的时间和内存消耗. 查询时,数据库所关心

mongoDB 高级查询语法

http://www.cnblogs.com/ITAres/articles/2084794.html本文参考自官方的手册:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ConditionalOperators%3A%3C%2C%3C%3D%2C%3E%2C%3E%3D 1 ) . 大于,小于,大于或等于,小于或等于 $gt:大于 $lt:小于 $gte:大于或等于 $lte:小于或等于 例子: db.c

Python札记 -- MongoDB模糊查询

最近在使用MongoDB的时候,遇到了使用多个关键词进行模糊查询的场景.竹风使用的是mongoengine库. 查了各种资料,最后总结出比较好用的方法.先上代码,后面进行详细说明.如下: 1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import re 5 import mongoengine 6 from mongoengine import * 7 8 mongoengine.register_connection('default', 'test'

MongoDB高级查询用法

译 MongoDB高级查询用法 2018年09月04日 18:52:43 小小小辉happy 阅读数 752更多 分类专栏: 数据库 db的帮助文档 输入:db.help(); db.AddUser(username,password[, readOnly=false])  添加用户 db.auth(usrename,password)     设置数据库连接验证 db.cloneDataBase(fromhost)     从目标服务器克隆一个数据库 db.commandHelp(name)

MongoDB数据查询

启动MongoDB:sudo service mongodb start,mongo 经测试,键可加引号也可不加,但是值一般要加引号,数值类型除外 MongoDB区分大小写,命名通常采用驼峰式命名法 MongoDB在使用数据库,插入集合等情况下,若数据库/集合不存在将自动创建 数据查询find() db.<集合名>.find({<键名>:<值>,...}) 格式化结果集:后加.pretty()即db.<CollectionName>.find({key:'v