zoukankan      html  css  js  c++  java
  • Nosql之Mongodb 2 高级查询

    接上文

    http://www.cnblogs.com/zhaoyang/archive/2012/01/09/2317505.html

    接上文…………

    高级查询

    find()

    1 查询所有记录

             db.users.find()

    2 查询name为apple的记录

             db.users.find({“name”:”apple”})

    3 查询country为china,gender为1的记录

             db.users.find({“country”:”china”,” gender”:1})

    限制结果集

    对应到标准sql, 之前是select * from, 现在需要的是select name from …

    1 查询name为apple,并且结果只显示name

             db.users.find({“name”:”apple”}, {“name”:true})

    ---------------------------------------------------------------------------------------------------------------------------

    注:后面这个参数{name:true}代表只显示name,如果有一个设置true,那么其他未设置的都是默认false,但是_id字段是默认true的,如果不想显示_id,可以这么写:

    db.users.find({“name”:”apple”}, {“name”:true,” _id”:false})

    ---------------------------------------------------------------------------------------------------------------------------

    2 查询所有记录,并且结果只显示name和country

             db.users.find(null, {“name”:true, “country”:true, “_id”:false})

    findOne()

    顾名思义,只显示查询到的第一条记录,类似于select top 1 …

    db.users.findOne({“gender”:0})

    limit()

    类似于sqlserver中的top

             db.users.find({“gender”:0}).limit(2);

    条件操作符 <, <=, >, >=, !=

    $lt   小于      (less than)

    $lte  小于等于  (less than equals)

    $gt   大于      (greater than)

    $gte  大于等于  (greater than equals)

    $ne  不等于    (not equals)

    查出age大于30的记录

    db.users.find({“age”:{$gt:30}})

    查出age>=30 且 <=40的记录

             db.users.find({“age”:{$gt:30, $lt:40}})

    $exists

    用于判断字段是否存在,比如我们向users集合里面添加一条记录,只有name属性

    db.users.insert({name:”testExists”})

    现在我们查出不存在age字段的记录

    db.users.find({“age”:{$exists:false}})

    查出有age字段但没有gender字段的记录

    db.users.find({“age”:{$exists:true},” gender”:{$exists:false}})

    null值的处理

    需要注意的null与exists的区别

    null指的是字段为空或者字段不存在

    exists指的是字段是否存在

    比较下面两条记录

    {“name”:null,” age”:44}

    {“age”:45}

    如果使用null查询  db.xxx.find({name:null}) 则会查出上面两条记录

    但是我们只想找出存在name字段并且其为空的记录,可以这么查询

    db.xxx.find({“name”:{$exists:true, $in:[null]}});

    $mod

    取模,比如我们查询年龄取模10等于1的记录,应该是年龄为1,11,21,…

    db.users.find({“age”:{$mod:[10,1]}})

    $in & $nin

    这个类似于标准sql的in与not in

    查询age为23或者24的记录

    db.users.find({“age”:{$in:[23, 24]}})

    查询age不为23或者24的记录

    db.users.find({“age”:{$nin:[23, 24]}})

    $not

    可以用在任何其他条件之上

    db.users.find({$not:{“age”:{$gt:25}}})

    $or

    查询年龄为32或者name为zhangsan的记录

    db.users.find({$or:[{“name”:”zhangsan”}, {“age”:32}]})

    数组操作

    假设我们有下面两个document

    ${“name”:”zhangsan”,” booksNumber”:[101, 102, 103]}

    ${“name”:”lisi”, “booksNumber”:[101, 103]}

    $all

    db.users.find({“booksNumber”:{$all:[101, 102]}});

    那么就能查出第一条记录,它需要满足里面所有的条件

    $size

    我们需要查询只有booksNumber里面只有两个的记录

    db.users.find({“booksNumber”:{$size:2}})

    count()

    查询总记录数

    db.users.find().count()

    注:如果我们使用了limit

    db.users.find().limit(3).count() 这里是取前三条记录,但是调用count()后还是显示总记录数,如果我们需要返回被限制后的记录数

    db.users.find().limit(3).count(true)即可

    sort()

    这也是个顾名思义的操作,排序: 1 代表升序  -1  代表降序

    按名字进行升序排序

    db.users.find().sort({name:1})

    先按名字升序,再按年龄降序

    db.users.find().sort({name:1, age:-1})

    distinct()

    查询年龄小于等于50所有的name并去除重复

    db.users.distinct(“name”, {“age”:{$lte:50}})

    skip()

    这一特性通常用于分页

    跳过三条记录并取之后的三条记录

    db.users.find().skip(3).limit(3)

    查询内嵌文档

    比如要查询这么一条记录:

    { “books”:{“bookid”:100, “bookname”:”english”} }

    db.users.find({“books.bookid”:100});

    使用正则表达式

    使用正则表达式也是mongodb非常强大的特性

    比如我们使用正则表达式对name进行过滤

    db.users.find({“name”:/^[fc]{1}/})

    $where

    可以使用javascript代码进行查询,这使得查询几乎能做任何事情

    db.users.find({$where:function() {

             //this指遍历到的当前的document

             //根据return true or false来判断此document是否满足find的条件

             if(this.name == “zhangsan”) {

                       return true;

             }

             for(var prop in this) {

                       if(this[prop] == “123”) {

                                return true;

                       }

    }

    return false;

    }});

    下一篇将介绍游标以及存储过程

  • 相关阅读:
    [转]HTTP请求模型和头信息参考
    括号匹配算法
    SQL LEFT JOIN 关键字 (转)
    Vim学习资料汇总
    与图相关的算法
    关于字符串的一些算法
    Huffman编码
    迅雷开放了下载引擎
    ubuntu下《UNIX环境高级编程》(apue.h)编译出错的处理方法
    学习unix信号
  • 原文地址:https://www.cnblogs.com/zhaoyang/p/2317664.html
Copyright © 2011-2022 走看看