zoukankan      html  css  js  c++  java
  • MongoDB入门系列(三):查询(SELECT)

    一、概述

    mongodb是最接近关系型数据库的NOSQL数据库,它的存储方式非常的灵活;以至于你会将它看成是一个经过冗余过的关系型数据库的表,这也是Mongodb原子性的一个特征。由于没有关系型数据库的表之间的关联关系和事务性所以Mongodb插入和更新的效率非常的高,同时也支持索引。我们在查询的时候不能带着关系型数据库的思维,可以简单的把集合看成是关系型数据库的表、文档看成是行、键看成是字段;但是Mongodb的键可以是数组也可以是文档这又像是支持xml类型的关系型数据库的字段。

    版本:3.4.10

    插入测试数据

    db.test.insert(
    [
    {name:"short sleeve",
     type:10,
     size:["S","M","L"],
     buyer:{ name:"chen", city:"guangzhou" },
     saleDetial:[{dates:ISODate("2012-11-02"),price:100,sales:10},
                 {dates:ISODate("2012-11-03"),price:110,sales:5},
                 {dates:ISODate("2012-11-04"),price:90,sales:15}
                ]
    },
    {name:"coat",
     type:11,
     size:["M","L"],
     buyer:{name:"zhang", city:"shanghai"},
     saleDetial:[{dates:ISODate("2012-11-02"),price:500,sales:20},
                 {dates:ISODate("2012-11-03"),price:600,sales:15},
                 {dates:ISODate("2012-11-04"),price:400,sales:30}
                ]
    },
    {name:"fleece",
     type:12,
     size:["S","M","L"],
     buyer:{name:"wang", city:"shenzhen"},
     saleDetial:[{dates:ISODate("2012-11-02"),price:350,sales:30},
                 {dates:ISODate("2012-11-03"),price:400,sales:15},
                 {dates:ISODate("2012-11-04"),price:500,sales:10}
                 ]
    }
    ]
    )

    二、简单查询

    显示DB:
    show dbs
    显示集合:
    show tables

    1.简单键

    db.collection.findOne()

    仅仅返回单个文档,相当于使用limit

     只查询name,type列;相当于select name,type from test

    db.test.find(
    {},
    {"_id":0,"name":1,"type":1}
    )

    查询名称等于“coat”的数据

    db.test.find(
    {name:"coat"},
    {"_id":0,"name":1,"type":1}
    )

    2.文档嵌套数组

    注意:数组的下标从0开始

    1.查询size数组的第一个元素等于M的记录

    db.test.find(
    {"size.0":"M"}
    )

    2.查询size数组保护M的记录

    db.test.find(
    {"size":"M"}
    )

    3.文档嵌套文档

     查询键buyer内嵌文档键name等于“chen”的文档

    db.test.find(
    {"buyer.name":"chen"}---列出文档内的元素的方法
    )
    或者
    db.test.find(
    {"buyer":{"name":"chen", "city":"guangzhou"}}
    )

    注意:如果使用完整的文档嵌套文档的查询方法,那么内嵌文档中的所有键值都要列出来匹配

    4.文档嵌套数组嵌套文档

     1.查询数组中的文档键等于

    db.test.find(
    {"saleDetial.price":"400"}
    )

    2.查询数组中第二个元素的文档键等于

    db.test.find(
    {"saleDetial.1.price":"400"},
    {"_id":0,"name":1,"type":1,"saleDetial.price":1}
    )

    三、运算符

    1.比较运算符

    MongoDB 与 RDBMS语句比较

    1.查询数组第一个元素的price大于400的文档

    db.test.find(
    {"saleDetial.0.price":{$gt:400}},
    {"_id":0,"name":1,"type":1,"size":1,"saleDetial":1}
    )

    2.$or运算符

    查询price大于500或者price小于100的文档

    db.test.find(
    {$or:[{"saleDetial.price":{$gt:500}},{"saleDetial.price":{$lt:100}}]},
    {"_id":0,"name":1}
    )

    注意:$or运算符之后是用中括号,里面的两个条件分别用大括号

    3.$and运算符

    1.查询价格大于100并且size等于S的文档名:select name from test where price>100 and size='S'

    db.test.find(
    {$and:[{"saleDetial.price":{$gt:100}},{"size":"S"}]},
    {"_id":0,"name":1}
    )
    等价于
    db.test.find(
    {"saleDetial.price":{$gt:100},"size":"S"},
    {"_id":0,"name":1}
    )

    对应$and默认可以省略。

    注意:如果是同一个字段的and条件必须这样写

    db.test.find({"saleDetial.price":{$gt:300,$lt:500}})

    下面这种写法是错误的,这张写法会认为是多个键值的的查询条件,最终的结果就是price>300 or price <500

    db.test.find({"saleDetial.price":{$gt:300},"saleDetial.price":{$lt:500}})

    4.$in运算符

    相当于关系型数据库的IN

     查询price大于100且buyer.name是zhang,chen的文档

    db.test.find(
    {$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$in:["zhang","chen"]}}]},
    {"_id":0,"name":1,"buyer":1}
    )

    4.$nin运算符

    $nin是in的否则条件

    db.test.find(
    {$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$nin:["zhang","chen"]}}]},
    {"_id":0,"name":1,"buyer":1}
    )

    5.$mod:取模匹配运算符

    相当于关系型数据库的%运算

    查询type%2余数为1的文档

    db.test.find(
    {"type":{$mod:[2,1]}},
    {"_id":0,"name":1,"buyer":1,"type":1}
    )

    6.$not否定运算

    查询type%2余数不等于1的文档

    db.test.find(
    {"type":{$not:{$mod:[2,1]}}},
    {"_id":0,"name":1,"buyer":1,"type":1}
    )

    7.null值判断

    //插入测试数据

    db.nullvar.insert([{"x":null},{"x":1},{"x":2}])   

    //查询null值的数据

    db.nullvar.find({"x":null})

    在以前2.6之前的版本查询null值非常的麻烦,代码如下:

    db.nullvar.find({"x":{"$in":[null],"$exists":true}})

    8.模糊查询

    使用正则表达式

    //查询name以包含short的文档

    db.test.find(
    {"name":/short/},
    {"_id":0,"name":1,"buyer":1,"type":1}
    )

    //查询name以short开头的文档

    db.test.find(
    {"name":/^short/},
    {"_id":0,"name":1,"buyer":1,"type":1}
    )

    //?查询

    db.test.find(
    {"name":/^coa?t/},
    {"_id":0,"name":1,"buyer":1,"type":1}
    )

    9.日期时间查询

     

    四、扩展操作

    1.sort、skip、limit

    db.test.find(
    {$or:[{"saleDetial.price":{$gt:400}},{"type":{$mod:[2,0]}}]},
    {"_id":0,"name":1,"buyer":1,"type":1}
    )
    .sort({"type":-1})
    .skip(1)
    .limit(10)

    相当于关系型数据库的写法:

    select name,buyer,type from test where price>400 or type%2=0
    order by type desc
    limit 1,10

     参考:http://www.runoob.com/mongodb/mongodb-query.html

    备注:

        作者:pursuer.chen

        博客:http://www.cnblogs.com/chenmh

    本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

    《欢迎交流讨论》

  • 相关阅读:
    60阶单群同构于A5的证明
    Riemann映射定理
    一个特殊情形的Mittag-Leffler分解
    一个重要的函数
    指数有限的子群存在一个右陪集代表元系,同时也是左陪集代表元系
    素数的平方阶群必为Abel群
    $mathscr{F}$类
    一个多项式问题
    Mittag-Leffler定理,Weierstrass因子分解定理和插值定理
    C -Concatenating Teams (字符串hash)
  • 原文地址:https://www.cnblogs.com/chenmh/p/8426527.html
Copyright © 2011-2022 走看看