以下查询以表名为:student为例,表数据格式
/* 1 */
{
"_id" : ObjectId("5ba0964680c36a8a91067d53"),
"name" : "jim",
"age" : 25.0,
"email" : "75431457@qq.com",
"c" : 89.0,
"m" : 96.0,
"e" : 87.0,
"country" : "USA",
"books" : [
"JS",
"C++",
"EXTJS",
"MONGODB"
]
}
/* 2 */
{
"_id" : ObjectId("5ba0964680c36a8a91067d54"),
"name" : "tom",
"age" : 25.0,
"email" : "214557457@qq.com",
"c" : 75.0,
"m" : 66.0,
"e" : 97.0,
"country" : "USA",
"books" : [
"PHP",
"JAVA",
"EXTJS",
"C++"
]
}
返回指定的键
db.student.find({查询条件},{field:value}) value:1 返回 0:不返回 例如:db.student.find({},{name:1})
查询条件
比较运算符
运算符 | 含义 | 事例 |
---|---|---|
$lt | < | {age:{$gte:22,$lte:27}} |
$lte | <= | |
$gt | > | |
$gte | >= | |
$ne | != | {age:{$ne:26}} |
-
运算符使用
1.1. 查询年龄在25岁到27岁之间,国籍为USA的学生db.student.find( { age:{$gte:25,$lte:27}, country:"USA" } )
1.2 查询出所有不是USA的学生数学成绩
db.student.find( { country:{$ne:"USA"} }, { "m":1, "country":1 } )
-
包含或者不包含($in 或 $nin)
2.1 查询国籍是China或USA的学生信息db.student.find( { country:{$in:["USA","China"]} } )
2.2 查询国籍不是China或者USA的学生信息
db.student.find( { country:{$nin:["USA","China"]} } )
-
OR查询
3.1 查询语文成绩大于85或者英语大于90的信息且国籍为USA的信息db.student.find( { $or:[{c:{$gte:85}},{e:{$gte:90}}], country:"USA" }, { _id:0, c:1, e:1, country:1 } )
-
Null
查询国籍为Null的信息
db.persons.find({country:{$in:[null]}},{country:1})
-
正则查询
查询出名字中存在"li"的信息
db.persons.find({name:/li/i},{country:1})
-
$not
查询出名字中不存在"li"的信息
db.persons.find({name:{\$not:/li/i}},{country:1})
-
数组查询
7.1 查询喜欢MONGODB和JS的学生db.student.find( { books:{$all:["JS","MONGODB"]} }, { _id:0, books:1, name:1 } )
7.2 查询第二本书是JAVA的数据
用索引做db.student.find( { "books.1":"JAVA" }, { _id:0, books:1, name:1 } )
-
$size
不能与比较查询一起使用
8.1 查询指定长度的数组为4
db.student.find( { books:{$size:4} }, { _id:0, books:1, name:1 } )
8.2 利用shell查询出Jim喜欢看书的数量var student = db.student.find({name:"jim"}) while(student.hasNext()){ obj = student.next(); print(obj.books.length) }
-
$slice操作符返回文档中指定数组的内部值
9.1 查询出 lixiaoli书架中第2~4本书db.student.find( { name:"lixiaoli" }, { books:{"$slice":[1,3]}, _id:0, name:1 } )
9.2 查询出 lixiaoli书架中最后一本书
db.student.find( { name:"lixiaoli" }, { books:{"$slice":-1}, _id:0, name:1 } )
-
文档查询 $elemMatch
首先为Jim添加学校信息var jim = [{ school :"K", score:"C" },{ school :"L", score:"B" },{ school :"J", score:"A" }] db.student.update({name:"jim"},{$set:{school:jim}})
查询School为K 且 score为A的记录
db.student.find( { "school.score":"A","school.school":"K" }, { school:1, name:1 } ) 结果 { "_id" : ObjectId("5ba0964680c36a8a91067d53"), "name" : "jim", "school" : [ { "school" : "K", "score" : "C" }, { "school" : "L", "score" : "B" }, { "school" : "J", "score" : "A" } ] } 显然上述结果是不对的,正确写法如下 db.student.find( { school:{$elemMatch:{school:"K",score:"A"}} } )
-
-
$where
-
分页与排序 limit Skip Sort
Skip如果数据量巨大的话,Skip的性能会有问题
查询出第5-8条数据,并以age排序 1:正序 -1:倒序db.student.find().limit(3).skip(5).sort({age:1})
若该排序字段的数据类型不统一则排序的优先级为: 最小值 null 数字 字符串 对象/文档 数组 二进制 对象ID 布尔 日期 时间戳 -> 正则 ->最大值
-
游标
var students=db.student.find(); while(students.hasNext()){ obj=students.next(); print(obj.name) }
a. 游标销毁条件
- 客户端发来信息叫他销毁
- 游标迭代完毕
- 默认游标超过10分钟没用也会别清除
b.高级查询