zoukankan      html  css  js  c++  java
  • MongoDB的查询

    1.多查询条件

    向查询文档加入多个键/值对的方式可以实现多个查询条件的组合。例如要查询所有用户名为“joe”且年龄为27岁的用户,可以像下面这样:

    1 >db.users.find({“username” : “joe”, “age” : 27})

    2.指定返回结果的键

    例如,如果只需要用户集合的“username”和“email”键感兴趣,可使用如下查询:

    1 >db.users.find({}, {“username” : 1, “email” : 1})

    同时也可以剔除查询结果中的某个键/值对,例如如果不希望结果中有“fatal_weakness”键,命令如下:

    1 >db.users.find({}, {“fatal_weakness” : 0})

    也可以用来防止返回“_id”。

    3.查询条件

    “$lt”小于,”$lte”小于等于,“$gt”大于,“$gte”大于等于,“$ne”不等于,例如:

    1 >db.users.find({“age” : {“$gte” : 18, “$lte” : 30}})

    $in类似Mysql中的IN,用法如下:

    1 >db.raffle.find({“ticket_no” : {“$in” : [725, 542, 390]}})

    $or类似Mysql中的OR,用法如下:

    1 >db.raffle.find({“$or” : [{“ticket_no” : 725}, {“winner” : true}]})

    $not类似Mysql中的逻辑操作符NOT,用法如:

    1 >db.user.find({“id_num” : {“$not” : {“$mod” : [5, 1]}}})

    说明:“$mod”会将查询的值除以第一个给定值,若余数等于第二个给定值则返回该结果。

    注意:一个键可以应用多个条件句,但不能对应多个更新修改器。

    4.特定类型的查询

    null:

    null不仅仅匹配自身,而且匹配缺少这个键的所有文档。若仅仅想要匹配键值为null的文档,用法如下:

    1 >db.c.find({“z” : {“$in” : [null], “$exists” : true}})

    正则表达式:

    MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式,PCRE支持的正则表达式语法都能被MongoDB所接受。例如可以使用正则表达式执行忽略大小写的匹配,如下:

    1 >db.users.find({“name” : /joe/i})

    数组:

    若要查询数组中的元素,可以理解为每个元素都是整个键的值。例如:

    >db.food.insert({“fruit” : [“apple”, “banana”, “peach”]})

    那么查询“fruit”键的值中包含“banana”的文档如下:

    1 >db.food.find({“fruit” : “banana”})

    但要是想通过多个元素来匹配数组时,要使用“$all”,例如:

    1 >db.food.find({“fruit” : {“$all” : [“apple”, “banana”]}})

    内嵌文档:

    查询内嵌文档的方法:查询整个文档,或者只针对其键/值对进行查询。例如有如下文档:

    复制代码
     1 {
     2 
     3          “name” : {
     4 
     5          “first” : “Joe”,
     6 
     7          “last” : “Schmoe”
     8 
     9 }
    10 
    11 “age” : 45
    12 
    13 }
    复制代码

    查询整个内嵌文档如下:

    1 >db.people.find({“name” : {“first” : “Joe”, “last” : “Schmoe”}})

    但需要注意这里的“name”键的值必须匹配整个文档。

    只针对内嵌文档的特定键值进行查询如下:

    1 >db.people.find({“name.first” : “Joe”, “name.last” : “Schmoe”})

    查询数组中嵌套内嵌文档:

    若文档结构如下:

    复制代码
     1 {
     2 
     3          “content” : “joe”,
     4 
     5          “comments” : [
     6 
     7          {
     8 
     9                    “author” : “joe”,
    10 
    11                    “score” : 3,
    12 
    13                    “comment” : “nice post”
    14 
    15 },
    16 
    17 {
    18 
    19          “author” : “mary”,
    20 
    21          “score” : 6,
    22 
    23          “comment” : “terrible post”
    24 
    25 }
    26 
    27 ]
    28 
    29 }
    复制代码

    那么要查询由Joe发表的5分以上的评论,写法如下:

    1 >db.blog.find({“comments” : {“$elemMatch” : {“author” : “joe”, “score” : {“$gte” : 5}}}})

    5.游标

    获取游标的方法如下:

    复制代码
    1 >var cursor = db.foo.find().sort({“x” : 1}).limit(1).skip(10);
    2 
    3 >while(cursor.hasNext()) {
    4 
    5 …obj = cursor.next();
    6 
    7//do stuff
    8 
    9 …}
    复制代码

    这里游标类还实现了迭代器接口,可以在foreach循环中使用。

    1 >cursor.forEach(function(x)) {
    2 
    3 …print(x.name);
    4 
    5 });

    注意:几乎所有游标对象的方法都返回游标本身,这样就可以按任意顺序组成方法链。

    上述内容中的limit(n)表示限制结果的数量,只返回n个结果。而skip(n)表示略过前n个文档,然后返回余下的文档。sort()用一个对象作为参数:一组键/值对,值代表排序方向,排序方向可以是1(升序)或者-1(降序),如果指定了多个键,则按照多个键的顺序逐个排序。

    注意:用skip略过少量的文档还是不错的,但要是数量非常多的话,skip会变得很慢,应避免过大的skip。

     
     
     
    标签: mongoDBnoSql数据库
  • 相关阅读:
    java.lang.OutOfMemoryError: Java heap space解决方法
    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
    CSS中.和#区别
    斯坦福数据挖掘之LSH的应用
    N个元素的集合划分成互斥的两个子集的数目
    JDBC小结
    初识Java反射机制
    关于Java中重载的若干问题
    吐槽
    Tomcat
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2881491.html
Copyright © 2011-2022 走看看