5. find操作详解
来源:互联网 发布:图书管理数据库er图 编辑:程序博客网 时间:2024/06/17 14:52
find操作详解
find语法:
db.[documentName].find({条件},{键指定})
1 查询出所有数据的指定键(name,age,country)
0:不显示 1:显示
db.persons.find({},{name:1,age:1,country:1,_id:0})> db.persons.find({},{name:1,age:1,country:1,_id:0}){ "name" : "jim", "age" : 25, "country" : "USA" }{ "name" : "tom", "age" : 25, "country" : "USA" }{ "name" : "lili", "age" : 26, "country" : "USA" }{ "name" : "zhangsan", "age" : 27, "country" : "USA" }
2.查询指定文档中的数据
查询所有: db.[documentName].find()
查询第一条数据: db.[documentName].findOne()
精确查找:
约定:
$lt
小于 $ne
不等于 $lte
小于或者等于 $or
或运算 $gt
大于 $and
与运算 $gte
大于或等于 $exists
包含或者不包含 $in
在范围内 $nin
不在范围内原始admin中所有的内容:
> db.admin.find(){ "_id" : 1, "name" : "tom1", "age" : 23 }{ "_id" : ObjectId("58247292f5c9ed83ca65cfd9"), "name" : "tom3", "age" : 33 }{ "_id" : 4, "name" : "iphone", "age" : 44 }{ "_id" : ObjectId("58247541c60186988c96cc67"), "gender" : "male", "age" : 44 }{ "_id" : 2, "age" : 22, "gender" : "male" }
2.1 查找 age 小于 30 的文档
> db.admin.find({age:{$lt:30}}){ "_id" : 1, "name" : "tom1", "age" : 23 }{ "_id" : 2, "age" : 22, "gender" : "male" }*
2.2 查找age范围在30(包含)和40(不包含)之间的文档
> db.admin.find({age:{$gte:30,$lt:40}}){ "_id" : ObjectId("58247292f5c9ed83ca65cfd9"), "name" : "tom3", "age" : 33 }
2.3 查找返回key值在1,2之间的记录
> db.admin.find({_id:{$in:[1,2]}}){ "_id" : 1, "name" : "tom1", "age" : 23 }{ "_id" : 2, "age" : 22, "gender" : "male" }
2.4 返回不包含name字段的所有记录(true为包含)
> db.admin.find({name:{$exists:false}}){ "_id" : ObjectId("58247541c60186988c96cc67"), "gender" : "male", "age" : 44 }{ "_id" : 2, "age" : 22, "gender" : "male" }
2.5 嵌套查询
{"_id":ObjectId("xxxxxxxxxxxxxxxxx"),"id":1,"name":"xiaohong","detail":[ {"sex":"female","age":105},{"address":"china","post":5} ]}
查询post等于5的文档:
db.customers.find( {‘detail.1.post’:5} )
对结果进行过滤,只返回 id 和 name 两个字段:
db.customers.find( {‘detail.1.post’:5} ,{_id:0, id:1, name:1})
对所有结果按照 id 进行降序排列():
db.customers.find({}).sort({id:-1})
先对结果集进行降序排序,然后跳过10行,从这个位置开始返回接下来的5行
db.find({}).skip(10).limit(5).sort({id:-1})
2.6 数组
原始数据:
> db.admin.find(){ "_id" : 4, "AttributeName" : "material", "AttributeValue" : [ "牛仔", "织棉", "雪纺", "蕾丝" ], "IsOptional" : 1 }{ "_id" : 5, "AttributeName" : "version", "AttributeValue" : [ "收腰型", "修身型", "直筒型", "宽松型", "其他" ], "IsOptional" : 1 }
a.精确匹配数组值
> db.admin.find({"AttributeValue":["收腰型","修身型","直筒型","宽松型","其他"]}){ "_id" : 5, "AttributeName" : "version", "AttributeValue" : [ "收腰型", "修身型", "直筒型", "宽松型", "其他" ], "IsOptional" : 1 }
b.匹配数组中的一个元素值
只要这些元素中包含有这个值,就会返回这条文档
> db.admin.find({"AttributeValue":"收腰型"}){ "_id" : 5, "AttributeName" : "version", "AttributeValue" : [ "收腰型", "修身型", "直筒型", "宽松型", "其他" ], "IsOptional" : 1 }
如果其他记录中的”AttributeValue”数组也包含这个值,也会作为结果返回
c.匹配指定位置的元素值
表示数组中第0个位置的元素值为”收腰型”的记录才返回
> db.admin.find({"AttributeValue.4":"其他"}){ "_id" : 5, "AttributeName" : "version", "AttributeValue" : [ "收腰型", "修身型", "直筒型", "宽松型", "其他" ], "IsOptional" : 1 }
d.指定数组索引并匹配嵌套文档中的字段值
(新插入的文档)StatusInfo是一个嵌套文档的数组,描述的是订单
{ “_id” : 7, “StatusInfo” : [ { “status” : 9, “desc” : “已取消” }, { “status” : 2, “desc” : “已付款” } ] }
> db.admin.find({"StatusInfo.1.status":2}){ "_id" : 7, "StatusInfo" : [ { "status" : 9, "desc" : "已取消" }, { "status" : 2, "desc" : "已付款" } ] }
发现返回的内容太多,返回的是整个文档,而不是单一的值
可以对查询进行优化,让其只返回StatusInfo字段
> db.admin.find({"StatusInfo.1.status":2},{_id:0,StatusInfo:1}){ "StatusInfo" : [ { "status" : 9, "desc" : "已取消" }, { "status" : 2, "desc" : "已付款" } ] }
内容还是太多,让其只返回StatusInfo字段中的status就行了(别忘了加” “号!!):
> db.admin.find({"StatusInfo.1.status":2},{_id:0,"StatusInfo.desc":1}){ "StatusInfo" : [ { "desc" : "已取消" }, { "desc" : "已付款" } ] }
实际需求更苛刻,要求返回当前订单的最新状态(在数组中也就是表示最后一条记录),
这时就需要用到数组投射的特定操作符:$slice
> db.admin.find({"_id":7},{_id:0,"StatusInfo":{"$slice":-1} ,"StatusInfo.desc":1}){ "StatusInfo" : [ { "desc" : "已付款" } ] }
第二组数据举例:
准备数据:
学生信息: 包括姓名name、年龄age、email、语文成绩c、数学成绩m、英语成绩e、国际country、喜欢看的书books
{ "_id" : ObjectId("582bd556f343ce738faa723c"), "name" : "jim", "age" : 25, "email" : "75431457@qq.com", "c" : 89, "m" : 96, "e" : 87, "country" : "USA", "books" : [ "JS", "C++", "EXTJS", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa723d"), "name" : "tom", "age" : 25, "email" : "214557457@qq.com", "c" : 75, "m" : 66, "e" : 97, "country" : "USA", "books" : [ "PHP", "JAVA", "EXTJS", "C++" ] }{ "_id" : ObjectId("582bd556f343ce738faa723e"), "name" : "lili", "age" : 26, "email" : "344521457@qq.com", "c" : 75, "m" : 63, "e" : 97, "country" : "USA", "books" : [ "JS", "JAVA", "C#", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa723f"), "name" : "zhangsan", "age" : 27, "email" : "2145567457@qq.com", "c" : 89, "m" : 86, "e" : 67, "country" : "China", "books" : [ "JS", "JAVA", "EXTJS", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa7240"), "name" : "lisi", "age" : 26, "email" : "274521457@qq.com", "c" : 53, "m" : 96, "e" : 83, "country" : "China", "books" : [ "JS", "C#", "PHP", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa7241"), "name" : "wangwu", "age" : 27, "email" : "65621457@qq.com", "c" : 45, "m" : 65, "e" : 99, "country" : "China", "books" : [ "JS", "JAVA", "C++", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa7242"), "name" : "zhaoliu", "age" : 27, "email" : "214521457@qq.com", "c" : 99, "m" : 96, "e" : 97, "country" : "China", "books" : [ "JS", "JAVA", "EXTJS", "PHP" ] }{ "_id" : ObjectId("582bd556f343ce738faa7243"), "name" : "piaoyingjun", "age" : 26, "email" : "piaoyingjun@uspcat.com", "c" : 39, "m" : 54, "e" : 53, "country" : "Korea", "books" : [ "JS", "C#", "EXTJS", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa7244"), "name" : "lizhenxian", "age" : 27, "email" : "lizhenxian@uspcat.com", "c" : 35, "m" : 56, "e" : 47, "country" : "Korea", "books" : [ "JS", "JAVA", "EXTJS", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa7245"), "name" : "lixiaoli", "age" : 21, "email" : "lixiaoli@uspcat.com", "c" : 36, "m" : 86, "e" : 32, "country" : "Korea", "books" : [ "JS", "JAVA", "PHP", "MONGODB" ] }{ "_id" : ObjectId("582bd556f343ce738faa7246"), "name" : "zhangsuying", "age" : 22, "email" : "zhangsuying@uspcat.com", "c" : 45, "m" : 63, "e" : 77, "country" : "Korea", "books" : [ "JS", "JAVA", "C#", "MONGODB" ] }
1.指定返回的键
a.查询出所有数据的指定键(name,age,country) 0:不显示 1:显示
> db.persons.find({},{name:1,age:1,country:1,_id:0}){ "name" : "jim", "age" : 25, "country" : "USA" }{ "name" : "tom", "age" : 25, "country" : "USA" }{ "name" : "lili", "age" : 26, "country" : "USA" }{ "name" : "zhangsan", "age" : 27, "country" : "USA" }
2.按条件查询
a. 查询出年龄在25到27岁之间的学生
> db.persons.find({age:{$gte:25,$lte:27}},{_id:0,age:1}){ "age" : 25 }{ "age" : 25 }{ "age" : 26 }{ "age" : 27 }{ "age" : 26 }{ "age" : 27 }{ "age" : 27 }{ "age" : 26 }{ "age" : 27 }
b. 查询出所有不是韩国籍的学生的数学成绩
>db.persons.find({country:{$ne:"Korea"}},{_id:0,name:1,country:1,m:1}){ "name" : "jim", "m" : 96, "country" : "USA" }{ "name" : "tom", "m" : 66, "country" : "USA" }{ "name" : "lili", "m" : 63, "country" : "USA" }{ "name" : "zhangsan", "m" : 86, "country" : "China" }{ "name" : "lisi", "m" : 96, "country" : "China" }{ "name" : "wangwu", "m" : 65, "country" : "China" }{ "name" : "zhaoliu", "m" : 96, "country" : "China" }
3.包含或不包含
$in
或$nin
a.查询国际是中国或者美国的学生信息
> db.persons.find({country:{$in:["USA","China"]}},{"_id":0,"name":1,"country":1}){ "name" : "jim", "country" : "USA" }{ "name" : "tom", "country" : "USA" }{ "name" : "lili", "country" : "USA" }{ "name" : "zhangsan", "country" : "China" }{ "name" : "lisi", "country" : "China" }{ "name" : "wangwu", "country" : "China" }{ "name" : "zhaoliu", "country" : "China" }
b.查询国际不是中国或者美国的学生信息
> db.persons.find({country:{$nin:["USA","China"]}},{"_id":0,"name":1,"country":1})
查出来的学生国籍都是韩国的
{ "name" : "piaoyingjun", "country" : "Korea" }{ "name" : "lizhenxian", "country" : "Korea" }{ "name" : "lixiaoli", "country" : "Korea" }{ "name" : "zhangsuying", "country" : "Korea" }
4 or 查询
$or
a.查询语文成绩大于85或者英语成绩大于90的学生信息
> db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1}){ "name" : "jim", "c" : 89, "e" : 87 }{ "name" : "zhangsan", "c" : 89, "e" : 67 }{ "name" : "zhaoliu", "c" : 99, "e" : 97 }
5. Null值查询
a.把中国国籍的学生增加新的键sex
> db.persons.update({country:"China"},{$set:{sex:"M"}})
执行完之后,所有国籍为China的学生都增加了一个sex键,我们可以查看一下:
> db.persons.find({},{_id:0,name:1,country:1,sex:1}){ "name" : "jim", "country" : "USA" }{ "name" : "tom", "country" : "USA" }{ "name" : "lili", "country" : "USA" }{ "name" : "zhangsan", "country" : "China", "sex" : "M" }{ "name" : "lisi", "country" : "China", "sex" : "M" }{ "name" : "wangwu", "country" : "China", "sex" : "M" }{ "name" : "zhaoliu", "country" : "China", "sex" : "M" }{ "name" : "piaoyingjun", "country" : "Korea" }{ "name" : "lizhenxian", "country" : "Korea" }{ "name" : "lixiaoli", "country" : "Korea" }{ "name" : "zhangsuying", "country" : "Korea" }
b.查询sex等于null的学生(也就是没有sex键的学生)
> db.persons.find({sex:{$in:[null]}},{_id:0,name:1,country:1,sex:1}){ "name" : "jim", "country" : "USA" }{ "name" : "tom", "country" : "USA" }{ "name" : "lili", "country" : "USA" }{ "name" : "piaoyingjun", "country" : "Korea" }{ "name" : "lizhenxian", "country" : "Korea" }{ "name" : "lixiaoli", "country" : "Korea" }{ "name" : "zhangsuying", "country" : "Korea" }
6.正则查询
a.查询出名字中存在”li”的学生信息
> db.persons.find({name:/li/i},{_id:0,name:1}){ "name" : "lili" }{ "name" : "lisi" }{ "name" : "zhaoliu" }{ "name" : "lizhenxian" }{ "name" : "lixiaoli" }
7.$not
的使用
$not
可以用在任何地方进行取反操作
a. 查询出名字中不存在”li”的学生的信息
> db.persons.find({name:{$not:/li/i}},{_id:0,name:1}){ "name" : "jim" }{ "name" : "tom" }{ "name" : "zhangsan" }{ "name" : "wangwu" }{ "name" : "piaoyingjun" }{ "name" : "zhangsuying" }
$not
和$nin
的区别:$not
可以用在任何地方,而$nin
只能用在数组集合上
8.数组查询$all和index的应用
a.查询喜欢看MONGODB和JS的学生
> db.persons.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1,sex:1}){ "name" : "jim" }{ "name" : "lili" }{ "name" : "zhangsan", "sex" : "M" }{ "name" : "lisi", "sex" : "M" }{ "name" : "wangwu", "sex" : "M" }{ "name" : "piaoyingjun" }{ "name" : "lizhenxian" }{ "name" : "lixiaoli" }{ "name" : "zhangsuying" }
b.查询第二本书是JAVA的学生信息
> db.persons.find({"books.1":"JAVA"},{_id:0,name:1,sex:1}){ "name" : "tom" }{ "name" : "lili" }{ "name" : "zhangsan", "sex" : "M" }{ "name" : "wangwu", "sex" : "M" }{ "name" : "zhaoliu", "sex" : "M" }{ "name" : "lizhenxian" }{ "name" : "lixiaoli" }{ "name" : "zhangsuying" }
9.查询指定长度数组
$size为指定的大小,他不能与比较查询符一起使用(这是一个弊端)
a.查询出喜欢的书籍数量是4本的学生
> db.persons.find({"books":{$size:4}},{_id:0,name:1,books:1}){ "name" : "jim", "books" : [ "JS", "C++", "EXTJS", "MONGODB" ] }{ "name" : "tom", "books" : [ "PHP", "JAVA", "EXTJS", "C++" ] }{ "name" : "lili", "books" : [ "JS", "JAVA", "C#", "MONGODB" ] }{ "name" : "zhangsan", "books" : [ "JS", "JAVA", "EXTJS", "MONGODB" ] }{ "name" : "lisi", "books" : [ "JS", "C#", "PHP", "MONGODB" ] }{ "name" : "wangwu", "books" : [ "JS", "JAVA", "C++", "MONGODB" ] }{ "name" : "zhaoliu", "books" : [ "JS", "JAVA", "EXTJS", "PHP" ] }{ "name" : "piaoyingjun", "books" : [ "JS", "C#", "EXTJS", "MONGODB" ] }{ "name" : "lizhenxian", "books" : [ "JS", "JAVA", "EXTJS", "MONGODB" ] }{ "name" : "lixiaoli", "books" : [ "JS", "JAVA", "PHP", "MONGODB" ] }{ "name" : "zhangsuying", "books" : [ "JS", "JAVA", "C#", "MONGODB" ] }
10.查询出喜欢的书籍数量大于3本的学生(此方法可以弥补问题9中的不足)
a.增加字段size
db.persons.update({},{$set:{size:4}},false,true)
b.改变书籍的更新方式,每次增加书籍的时候size增加1
>db.persons.update({name:"jim"},{$push:{books:"ORACLE"},$inc:{size:1}})
c.利用$get查询书籍数量大于4的同学
> db.persons.find({size:{$gt:4}},{_id:0,name:1}){ "name" : "jim" }
11.利用shell查询出jim喜欢看的书的数量
var jim = db.persons.find({“name”:”jim”})
while(jim.hasNext()){
obj = jim.next();
print(obj.books.length)
}
结果:5
小结:
1. MongoDB是NoSQL数据库但是他在文档查询上还是很强大的
2. 查询符基本是用到花括号里面的更新符基本是在外面
3. shell是个彻彻底底的JS引擎,但是一些特殊的操作要靠他的各个驱动包来完成(JAVA,node.js)
12.$slice
操作符返回文档中指定数组的内部值
a. 查询出jim书架中第2~4本书
> db.persons.find({name:"jim"},{books:{$slice:[1,3]},_id:0,name:1}){ "name" : "jim", "books" : [ "C++", "EXTJS", "MONGODB" ] }
b. 查询出最后一本书
> db.persons.find({name:"jim"},{books:{$slice:-1},_id:0,name:1}){ "name" : "jim", "books" : [ "ORACLE" ] }
13.文档查询
准备数据:
为jim添加学习简历文档:
var jim = [{ school :"K", score:"A"},{ school :"L", score:"B"},{ school :"J", score:"A+"}]db.persons.update({name:"jim"},{$set:{school:jim}})
a. 查询出在K学校上过学的学生
1.这个我们使用绝对匹配可以完成,但是缺点在于,必须准备好其他非必要条件,并且顺序错误是无法查询到的(不推荐)
> db.persons.find({school:{school:"K",score:"A"}},{_id:0,school:1}){ "school" : [ { "school" : "K", "score" : "A" }, { "school" : "L", "score" : "B" }, { "school" : "J", "score" : "A+" } ] }
问题1:我不知道他的成绩怎么办?或者我就是为了查询这个分数的,缺少条件是无法查到结果的
> db.persons.find({school:{score:"A"}},{_id:0,school:1})
无结果
问题2:如果我调换了这两个属性的位置,那什么也查不出来
> db.persons.find({school:{score:"A",school:"K"}},{_id:0,school:1})
无结果
2.为了解决顺序的问题,可以使用对象”.”的方式定位(不推荐)
>db.persons.find({"school.score":"A","school.school":"K"},{_id:0,school:1}){ "school" : [ { "school" : "K", "score" : "A" }, { "school" : "L", "score" : "B" }, { "school" : "J", "score" : "A+" } ] }
3.这样貌似能够解决顺序的问题,但是又出现了新的问题:
当我想查询出在J学校上过学并且得到成绩为A的学生,同样能查出这条数据,但是这是不符合逻辑的 (不推荐)
>db.persons.find({"school.score":"A","school.school":"J"},{_id:0,school:1}){ "school" : [ { "school" : "K", "score" : "A" }, { "school" : "L", "score" : "B" }, { "school" : "J", "score" : "A+" } ] }
4.正确做法:使用单条条件组查询 $elemMatch (推荐)
> db.persons.find({school:{$elemMatch:{school:"K",score:"A"}}},{_id:0,school:1})可以成功查询出正确结果{ "school" : [ { "school" : "K", "score" : "A" }, { "school" : "L", "score" : "B" }, { "school" : "J", "score" : "A+" } ] }
当我们再次尝试使用”J”+”A”组合查询时,发现查不到任何匹配文档,说明这是完美的做法
14.$where
a.查询年龄大于22岁,喜欢看c++书,在k学校上过学的学生信息
对于这样的复杂查询,使用$where查询,因为很万能
不过我们应该避免使用它,因为效率不是很高
db.persons.find({"$where":function(){ //查询 var books = this.books; var school = this.school; if(this.age > 22){ var php = null; for(var i=0; i if(books[i] == "c++"){ php = books[i]; if(school){ for(var j=0; j< school.length; j++){ if(school[j].school == "K"){ return true; } } break; } } } }}})
查询结果:
{ "name" : "jim", "age" : 25, "books" : [ "JS", "C++", "EXTJS", "MONGODB", "ORACLE" ] }
- 5. find操作详解
- MongoDB的find操作详解
- find 详解
- find 详解
- find详解
- VBA中的FIND操作
- Linux关于find操作
- find操作总结
- linux find 操作
- string的find操作
- find常用操作总结
- Find命令使用详解
- Linux find命令详解
- UNIX find命令详解
- z find 命令详解
- find命令详解
- Linux find命令详解
- Linux find命令详解
- Android中如何根据图片url路径来获取网络图片
- 剔除空格,用空格进行分割字符串
- C++中关于数据小数点,取整的方法
- java中dom4j解析xml文件怎么获取节点属性
- 【C#MVC】使用ajaxFileUpload导入Excel,并显示在Grid中
- 5. find操作详解
- VS-安装后出现“未找到与约束contractname”
- mysql 数据导入导出
- C#中的一些小问题
- angularjs学习指南
- Matlab与线性代数 -- 逆矩阵
- Android 封装SharedPreferences类
- 获得 LayoutInflater 实例的三种方式
- 中科呐喊WiFi热点广告机,WiFi营销及创意展示神器