MongoDb进阶实践之四 MongoDB查询命令详述


1、引言


           上一篇文章咱们已经介绍了MongoDB数据库的最基本操做,包括数据库的建立、使用和删除数据库,文档的操做也涉及到了文档的建立、删除、更新和查询,固然也包括集合的建立、重命名和删除。有了这些基本操做,你们第一次使用MongoDb数据库的时候就不会慌张,慢慢操做就能够了。虽然上一篇文章简单介绍了一些文档的查询,那都是最基本的,因为文档的查询涉及的内容比较多,因此咱们须要单独写一篇文章来专门介绍有关文档的查询的详细信息。废话很少说,立刻开始咱们今天的写做吧。


2、MongDB查询的详解
          
          我比较直接,直接上内容,有关查询的每一个方法都有示例代码,应该不是很难。


            一、find()查询方法:根据查询条件返回符合条件的全部文档

                     MongoDB 查询文档使用 find() 方法,find() 方法以非结构化的方式来显示全部文档。

                     语法:db.collectionName.find(query, projection)

                    参数说明:

                         query :可选,使用查询操做符指定查询条件

                         projection :可选,使用投影操做符指定返回的键。查询时返回文档中全部键值, 只需省略该参数便可(默认省略)。格式相似{<key>:1,<key>:1,_id:0},0值表示不显示,其余值均为显示,不管正负值。该参数控制不显示的字段,须要显示的不在该参数里书写就能够。

                     若是你须要以易读的方式来读取数据,可使用 pretty() 方法,语法格式以下:

                     >db.collectionName.find().pretty()

                     pretty() 方法以格式化的方式来显示全部文档。


                     1.一、示例代码:查询全部文档

shell

                          //find()方法内没有任何查询条件,查询全部记录,find({})方法表示空条件,也就是无条件,和find()方法查询结果同样。
                          > db.students.find()
                         { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                         { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                         { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }


                         > db.students.find({})
                         { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                         { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                         { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }


                     1.二、示例代码:根据指定条件查询文档数据库

                         //查询【name】字段的值是【angShiYu】 的文档
                         > db.students.find({name:"FangShiYu"})
                        { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }


                         //查询【sex】性别字段是【1】男的全部文档
                         > db.students.find({sex:1})
                         { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                         { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }

                         //查询【sex】性别字段是【1】男的,而且【age】字段的值是【22】的全部文档
                         > db.students.find({sex:1,age:22})
                         { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                         > 


                     1.三、示例代码:控制字段的显示 spa

                         //find({查询条件},{控制字段显示与否})方法的第二个参数控制查询出来的字段的显示,_id:0,表示不显示,其余值均为显示,不写该字段也会显示,_id主键除外的字段,须要显示就写上,可是其值不能是0,好比:address:0,这会产生错误,address:1/-1都会显示

                         //查询【sex】性别字段是【1】男的全部文档,_id字段不显示,只显示【name】,【age】,【school】字段
                         > db.students.find({sex:1},{_id:0,name:-1,age:1,school:1})
                         { "name" : "FangShiYu", "age" : 22, "school" : "ZheJiangDaXue" }
                         { "name" : "HuangFeiHong", "age" : 32, "school" : "GuangDongDaXue" }
                         > 


                     1.四、示例代码:格式化文档code

                         //使用pretty()格式化输出
                         > db.students.find({sex:0}).pretty()
                        {
                                 "_id" : ObjectId("5ab9de223afa6504457050e3"),
                                 "name" : "YanYongChun",
                                 "age" : 27,
                                 "sex" : 0,
                                 "school" : "FuJianDaXue",
                                 "address" : "FuJianNanTianRen"
                         }



            二、findOne()查询方法:查询结果只会返回符合条件的第一条文档

                     MongoDB 查询文档使用 findOne()方法查询符合条件的第一条文档,使用和find()方法相似,并以非结构化的方式来显示全部文档。

                     语法:db.collectionName.findOne(query, projection)

                     参数说明:


                             query :可选,使用查询操做符指定查询条件

                             projection :可选,使用投影操做符指定返回的键。查询时返回文档中全部键值, 只需省略该参数便可(默认省略)。格式相似{<key>:1,<key>:1,_id:0},非0的值表示显示,0表示不显示

                             findOne()方法不支持pretty()方法。


                     2.一、示例代码:显示符合条件的第一条记录                         blog

                        //性别【sex】是【1】男性的有两条文档,可是只显示了第一条
                         >  db.students.findOne({sex:1})
                         {
                                  "_id" : ObjectId("5ab9de223afa6504457050e2"),
                                  "name" : "FangShiYu",
                                  "age" : 22,
                                  "sex" : 1,
                               "school" : "ZheJiangDaXue",
                              "address" : "GuangDongGuangZhou"
                         }


                     2.二、示例代码:控制字段列的显示排序

                         >  db.students.findOne({sex:1},{_id:0,name:1,age:1,sex:1,school:1,address:1})
                         {
                                  "name" : "FangShiYu",
                                  "age" : 22,
                                  "sex" : 1,
                                  "school" : "ZheJiangDaXue",
                                  "address" : "GuangDongGuangZhou"
                         }
                         > 


                     2.三、示例代码:findOne()方法不支持pretty()方法索引

                         > db.students.find({sex:1},{_id:0,name:-1,age:1,school:1}).pretty()
                         2018-03-29T13:27:12.277+0800 E QUERY    [thread1] TypeError: db.students.findOne(...).pretty is not a function :
                         @(shell):1:1



            三、条件操做符

                     若是你熟悉常规的 SQL 数据,经过下表能够更好的理解 MongoDB 的条件语句查询:


                     3.一、: 等于 :查询指定字段的值等于某个具体的值的时候返回符合条件的文档

                           语法:db.collectionName.find({<key>:<value>})

                          
参数说明:

                             key:须要执行查询判断的字段名

                             value:这个值是一个具体的数值,而且这个值须要和Key字段里面的值进行比较,只有当Key字段的值等于Value的时候,才返回符合条件的文档


                           实例代码:ip

                                > db.students.find({"name":"FangShiYu"})
                                { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }


                     3.二、$lt 小于:查询指定字段的值小于某个具体的值的时候返回符合条件的文档

                           语法:db.collectionName.find({<key>:{$lt:<value>}})

                          
参数说明:

                              key:须要执行查询判断的字段名

                              value:这个值是一个具体的数值,而且这个值须要和Key字段里面的值进行比较,只有当Key字段的值小于Value的时候,才返回符合条件的文档


                           实例代码:文档

                                >db.students.find({"age":{$lt:27}})
                                { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }


                     3.三、$lte 小于或等于 :查询指定字段的值在小于或者等于某个具体的数值时返回全部符合条件的文档

                           语法:db.collectionName.find({<key>:{$lte:<value>}})

                          
参数说明:

                              key:须要执行查询判断的字段名

                             value:这个值是一个具体的数值,而且这个值须要和Key字段里面的值进行比较,只有当Key字段的值小于或者等于Value的时候,才返回符合条件的文档


                           实例代码:it

                                > db.students.find({"age":{$lte:27}})
                                { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                                { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                                > 



                     3.四、$gt 大于:查询指定字段的值是大于某个具体的值的全部文档

                           语法:db.collectionName.find({<key>:{$gt:<value>}})

                           参数说明:

                              key:须要执行查询判断的字段名

                             value:这个值是一个具体的数值,而且这个值须要和Key字段里面的值进行比较,只有当Key字段的值大于Value的时候,才返回符合条件的文档



                           实例代码

                                > db.students.find({"age":{$gt:27}})
                               { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
                                > 



                     3.五、$gte 大于或等于 :查询指定字段的值是大于或者等于某个值的全部文档

                           语法:db.collectionName.find({<key>:{$gte:<value>}})

                           参数说明:

                              key:须要执行查询判断的字段名

                             value:这个值是一个具体的数值,而且这个值须要和Key字段里面的值进行比较,只有当Key字段的值比Value大或者相等,并返回符合条件的文档



                           实例代码:

                                > db.students.find({"age":{$gte:24}})
                                { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                                { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
                                 > 


                     3.六、$ne 不等于:查询指定字段的值不等于某个特定值并返回符合条件的文档

                           语法:db.collectionName.find({<key>:{$ne:<value>}})

                           参数说明:

                                   key:须要执行查询的字段名

                                  value:这个值是一个具体的数值,而且这个值须要和Key字段里面的值进行比较,不相等,就执行查询,并返回符合条件的记录



                           实例代码:

                                > db.students.find({"sex":{$ne:1}})
                               { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }


                     3.七、$gte 和 $lte 大于等于、小于等于:查询指定字段的值属于某个指定值的范围的全部文档,知足条件返回文档

                           语法:db.collectionName.find({<key>:{$gte:<value1>,$lte:<value2>}})

                           参数说明:

                                   key:进行比较的字段名

                                  $gte:大于等于

                                  value1:这个值是要大于等于的那个值

                                  $lte:小于等于

                                  value2:这个值是要小于等于的那个值
                                
                                  value1和value2造成一个比较的范围,能够针对名称为Key的字段的值进行判断



                           实例代码:

                                > db.students.find({"age":{$gte:20,$lte:27}})
                               { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                               { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                                > 


             四、And和Or 的使用

                   4.一、and 的使用:和的关系,必须知足全部的条件才能完成查询

                         语法:db.collectionName.find({query1,query2,query3,...queryn})

                        参数说明:

                                query1-n:查询条件,这些查询条件必须在一个花括号({})里面,这种使用方式才是and的关系


                         示例代码:

                             >db.students.find({age:{$gt:24},sex:0})
                             { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                             > 

                        
                   4.二、or 的使用:或的关系,知足条件之一就能够完成查询

                         语法:db.collectionName.find({$or:[{query1},{query2},{query3},...{queryn}]}) 

                        参数说明:

                                query1-n:是查询条件,条件之间是或(or)的关系,而且“[]”方括号不能省略



                         示例代码:

                             >db.students.find({$or:[{sex:0},{age:22}]})
                             { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                             { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                             > 


                   4.三、and 和 or

                         语法:db.collectionName.find({query1,query2,query3,...,$or:[{query4},{query5},{query6},...]]})

                        参数说明:

                               query1-n:都是查询的条件,前面的查询条件和后面的查询条件是or的关系,“$or”前面部分的查询条件是and的关系,后面的是or的关系



                         示例代码:

                             > db.students.find({age:{$gt:24},sex:0,$or:[{sex:1},{age:27}]})
                             { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                             > 


             五、以ID做为查询条件

                   语法:db.collectionName.find({_id:ObjectId("id的值")})

                  参数说明:

                           _id:Mongodb自动生成的主键,这个是固定写法,不能改变。

                          ObjectId:表明是主键_id的值,整个的写法是:ObjectId("5ab9de223afa6504457050e2"),这个方法的值才是_id主键的值,其余写法是错误



                   代码实例:

                        > db.students.find({_id:ObjectId("5ab9de223afa6504457050e2")})
                       { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                        > 


             六、count()方法:统计查询文档记录的条数

                   语法:db.collectionName.find({query1,query2...queryn}).count()
                   
                   参数说明:

                         query1-n:查询条件,能够有多个查询条件,多个查询条件之间是and的关系。


                   代码实例:

                        > db.students.find({"sex":1}).count()
                        2
                        > 


             七、查询以什么值开头

                   语法:db.collectionName.find({<key>:/^value/})

                  参数说明:

                           key:要查询的字段的名称

                          value:检查key字段的值中是否以value开始,格式:/^value/,斜杠“/”和“^”不能省略



                   代码实例:

                        > db.students.find({name:/^F/})
                        { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }



             八、查询某个字段老是否包含另外一个值

                   语法:db.collectionName.find({<key>:/value/})

                  参数说明:

                           key:查询的字段的名称

                          value:查询key字段的值中是否包含着value的值,先后的两个斜杠“/”不能省略

                   

                   代码实例:

                        > db.students.find({name:/ng/})
                        { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                        { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                        { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }


             九、limit()和skip()方法的使用


                   9.一、limit()方法:只显示num条

                        语法:db.collectionName.find({query}).limit(num)

                        参数说明:

                               query:查询条件

                               num:条数,仅仅显示的条数


                        示例代码:

                            //显示前2条
                            >db.students.find().limit(2)
                            { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                            { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }



                   9.二、skip()方法:跳过num条后继续显示

                        语法:db.collectionName.find({query}).skip(num)

                       参数说明:

                                query:查询条件

                                num:跳过的条数


                        示例代码:

                            //跳过2条,从第3条开始显示
                            >db.students.find().skip(2)
                            { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
                            > 


                   9.三、skip()和 limit() 联合使用:分页显示


                        语法:db.collectionName.find({query}).skip(pageIndex*pageSize).limit(pageSize)

                        参数说明:

                                   query:查询条件

                                   pageIndex:页码索引,从0开始

                                   pageSize:每页显示的条数


                        示例代码:

                            //跳过1条,从第2条开始显示2条
                            > db.students.find().skip(1).limit(2)
                            { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                            { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
                            > 


             十、sort()方法:针对某个字段进行升序或者降序排序

                   语法:db.collectionName.find({query}).sort({<key>:1升序|-1 降序})

                  参数说明:

                          query:查询条件

                          key:针对排序的字段名,1为升序,-1为降序,不能为其余值


                   示例代码:

                         //按年龄(age)升序排列
                         > db.students.find().sort({age:1})
                         { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                         { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                         { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }


                         //按年龄(age)降序排列
                         > db.students.find().sort({age:-1})
                         { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
                         { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                         { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }


             十一、$type 操做符:能够针对某个字段查询该字段的值和具体数据类型相匹配的文档

                    语法:db.collectionName.find({<key>:{$type:<value>}})

                    参数说明:

                           key:要操做的字段名称

                           value:表示类型对应的值


                    $type操做符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

                    MongoDB 中可使用的类型以下表所示:

                       类型                               数字       备注

                       Double                             1     
                       String                               2     
                       Object                              3     
                       Array                                4     
                       Binary data                       5     
                       Undefined                         6       已废弃。
                       Object id                           7     
                       Boolean                            8     
                       Date                                  9     
                       Null                                  10     
                       Regular Expression         11     
                       JavaScript                        13     
                       Symbol                             14     
                       JavaScript (with scope)    15     
                       32-bit integer                   16     
                       Timestamp                       17     
                       64-bit integer                   18     
                       Min key                          255       Query with -1.
                       Max key                         127


                        示例代码:

                             //若是想获取 "school" 集合中 name 为 String 的数据,你可使用如下命令:
                             > db.students.find({"name":{$type:2}})
                             { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
                             { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
                             { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
                              > 



3、总结           今天就写到这里了,有关查询和更新的内容还不少,今天只是介绍一个大概的内容,让你们对MongoDB的操做有一个初步的印象。咱们之后会用更多的章节介绍查询和跟新的内容,包括条件操做符,修改操做符,还有一些特殊的操做符,正由于这部分的内容不少,因此须要咱们使用单独的章节来介绍其内容。不忘初衷,继续努力吧。

相关文章
相关标签/搜索