查询
查询是任何数据库脚本中最重要的部分,包括:
- 简单条件查询
- 复杂查询
- 聚合查询
- 与JS或Mapreduce查询
以上所有查询一定会用到查询器(Query Operator)
简单条件查询
以以下数据为例:
[
{
stuname:"jim",
age:25,
email:"234234@qq.com",
java:89,
hadoop:96,
hive:87,
city:"jinan",
books:["JS","C++","EXTJS","MONGODB"]
},
{
stuname:"tom",
age:25,
email:"23423234@qq.com",
java:79,
hadoop:66,
hive:97,
city:"jinan",
books:["JAVA","ORACLE","C#","MONGODB"]
},
{
stuname:"lili",
age:27,
email:"11234234@qq.com",
java:80,
hadoop:76,
hive:77,
city:"Qingdao",
books:["HIVE","HTML","EXTJS","WEB"]
},
{
stuname:"zzxb",
age:29,
email:"23121234@qq.com",
java:59,
hadoop:66,
hive:87,
city:"Qingdao",
books:["JS","C#","EXTJS","MONGODB"]
},
{
stuname:"xm",
age:35,
email:"323234234@qq.com",
java:84,
hadoop:86,
hive:82,
city:"jinan",
books:["mysql","C++","html","MONGODB"]
},
{
stuname:"zx",
age:40,
email:"234234@qq.com",
java:49,
hadoop:56,
hive:97,
city:"yantai",
books:["web","java","hadoop","html"]
},
{
stuname:"zm",
age:35,
email:"1144234234@qq.com",
java:80,
hadoop:76,
hive:83,
city:"yantai",
books:["wx","java","EXTJS","MONGODB"]
},
{
stuname:"zz",
age:25,
email:"234234@qq.com",
java:79,
hadoop:96,
city:"yantai",
books:["oracle","objective-c","android","html"]
},
{
stuname:"fr",
age:25,
email:"23488234@qq.com",
java:89,
hadoop:96,
hive:87,
city:"jinan",
books:["mysql","android","EXTJS","MONGODB"]
},
{
stuname:"zlh",
age:45,
email:"29934234@qq.com",
java:84,
hadoop:66,
hive:89,
city:"jinan",
books:["oracle","objective-c","EXTJS","MONGODB"]
}
]
使用find
查询
find语法:
db.collection.find(query, projection)
//query:查询条件
//projection:附加条件
使用find
查询全部字段:
db.students.find();
使用find
查询全部字段,并显示除id
以外的全部字段
db.students.find(
{},
{
_id:0,
stuname:1,
age:1,
java:1
}
)
注:_id字段默认为1,即显示; 若让其不显示,必须显式指定其字段为0.
带条件查询:查询city在济南的全部学生的姓名、年龄、所在城市
db.students.find(
{
city:'济南'
},
{
_id:0,
stuname:1,
age:1,
city:1
}
)
查询器
查询器 | 含义 | 对应 |
---|---|---|
$gt | 大于 | > |
$lt | 小于 | 小于 |
$gte | 大于等于 | ≥ |
$lte | 小于等于 | ≤ |
$eq | 等于 | == |
$ne | 不等于 | != |
例:查询java成绩大于70分的学生(使用查询器$gt
)
db.students.find(
{
java:{
$gt:70
}
},
{
_id:0,
stuname:1,
age:1,
java:1
}
)
例:查询hadoop成绩大于等于66分的学生信息
db.students.find(
{
hadoop:{
$gte:66
}
}
)
查询器总结:
- 查询器和修改器都是以$开头
- 查询器与修改器语法格式有区别
//查询器格式
字段:{
$查询器:值
}
//修改器格式
$修改器:{
字段:值
}## 标题文字 ##
and查询
and是隐式语法,不用注明关键字
eg:查询hadoop成绩大于等于66分,且所在地在济南的学生信息
db.students.find(
{
hadoop:{
$gte:66
},
city:'jinan'
}
)
eg:查询年龄大于等于25岁,且小于28岁的学生信息
//-------------正确写法-------------//
db.students.find(
{
age:{
$gte:25,
$lt:28
}
}
)
//-------------错误写法-------------//
db.students.find(
{
age:{
$gte:25
},
age:{
$lt:28
}
}
)
注:★比较符对同一个字段的时候,一定不要写成两个age,因为机制是后覆盖前,会导致查询结果错误。
eg:查询所在地不在济南的学生的信息
db.students.find(
{
city:{
$ne:'jinan'
}
}
)
or语法查询
or是显式语法,需要声明$or
语法格式:
{$or:[ {<expression 1}, <expression 2}, ...,<expression n} ]}
eg:查询hadoop分数大于70分的学生或城市是青岛的学生
db.students.find(
{
$or:[
{
hadoop:{$gt:70}
},
{
city:'Qingdao'
}
]
}
)
in/nin语法查询
针对同一离散值字段的or查询
eg:查询所有济南或烟台的学生信息
db.stduents.find(
{
city:{
$in:[
'jinan',
'yantai'
]
}
}
)
eg:查询所有不在青岛或或烟台的学生信息
dn.students.find(
{
city:{
$nin:[
'jinan',
'yantai'
]
}
}
)
exists
用于判断某字段是否存在
eg:查询素有sex为空的学生信息
直接用null搜索
db.students.find( { sex:null } )
用in搜索
db.students.find( { sex:{ $in:[null] } } )
用
$exists
db.students2.find( { sex : { $exists:false } } )
true表示字段存在,false表示不存在字段信息
type
按照数据类型查询数据
eg:查询sex字段为字符串类型的数据的信息(字符串类型的$type
值是10)
db.students.find(
{
sex:{
$type:2
}
}
)
type对应的数值类型:
类型 | 数字 |
---|---|
Double | 1 |
String | 2 |
Array | 4 |
Boolean | 8 |
Date | 9 |
Null | 10 |
Regular Expression | 11 |
not
$not
就是逻辑非。但是在与查询器连用时,需要注意“非”的含义,非常容易搞混。
对于下面的语句:
db.inventory.find( { price: { $not: { $gt: 1.99 } } } )
我们知道gt
的意思是大于,很容易想到上面的语句是“小于等于1.99”
但是这个理解是错的!!
$gt:1.99
的真正含义是:某字段存在且大于1.99,有“存在”和“大于”两个限制条件
所以上面语句的真正意思包括两条:
- 该字段的值小于等于1.99,或:
- 该字段不存在。
nor
nor
对包含一个或多个查询表达式的数组执行逻辑运算,选择数组中所有查询表达式都不符合的文档。
语法如下:
db.inventory.find( { $nor: [ { price: 1.99 }, { sale: true } ] } )
例:
db.inventory.find( { $nor: [ { price: 1.99 }, { qty: { $lt: 20 } }, { sale: true } ] } )
该查询包括以下文档:
- price不等于1.99,且sale值不等于true,或:
- price不等于1.99,且不包含sale字段,或:
- 不包含price,且sale字段为false
- 不包含price,且不包含sale字段
Comments | NOTHING