查询
查询是任何数据库脚本中最重要的部分,包括:
- 简单条件查询
 - 复杂查询
 - 聚合查询
 - 与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] } } )用
$existsdb.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