MongoDB入门6——查询(二)ITeye - 威尼斯人

MongoDB入门6——查询(二)ITeye

2019年02月27日13时48分17秒 | 作者: 翠安 | 标签: 文档,数组,成果 | 浏览: 1885

 3.查询中null的处理

        null的匹配十分有意思:null不只仅会匹配到指定键的值的确等于null的文档,并且还会匹配到查询所拟定键不存在的文档。例如,刺进下面这三个文档:

 db.users.insert({"name":"Tom","age":20,"job":"Sales"});
 db.users.insert({"name":"Sam","age":25,"job":"Manager"});
 db.users.insert({"name":"Jim","age":25});
 db.users.insert({"name":"Sam","age":25,"job":null});

        现在咱们用传统的办法来匹配job为null的文档:

 db.users.find({"job":null});

        成果如下:

{ "_id" : ObjectId("4f0714e3edb28db4864be582"), "name" : "Jim", "age" : 25 }
{ "_id" : ObjectId("4f071542edb28db4864be583"), "name" : "Sam", "age" : 25, "job" : null }

        很明显,不只将job的确为null的文档匹配出来,并且将没有job这个键的文档匹配出来了。许多时分这并不是咱们的原意。有一个$exists操作符能够来处理这个问题。先看代码:

db.users.find({"job":{"$in":[null],"$exists":true}});

        成果如下:

{ "_id" : ObjectId("4f071542edb28db4864be583"), "name" : "Sam", "age" : 25, "job" : null }

4.正则表达式

        MongoDB运用Perl兼容的正则表达式库来匹配正则表达式。正则表达式自身十分强壮,有专门写这个的书,我这儿不针对这个,仅仅简略的举个比方。例如,疏忽大小写情况下匹配name为Tom的文档:

db.users.find({"name":/tom/i});

5.数组查询

        数组查询大的思路:大部分情况下,数组的每个元素都可所以对应键的值。这么说必定欠好了解,举个比方,刺进下面这样一个文档:

db.food.insert({"fruit":["apple","banana","peach"]});

        现在履行下面三个查询,都会将这个文档匹配出来。

db.food.find({"fruit":"apple"});
db.food.find({"fruit":"banana"});
db.food.find({"fruit":"peach"});

        假如需求匹配fruit键的值既有apple又有banana的文档,能够运用$all匹配符。现在咱们假定有下面几个文档:

{ "_id" : ObjectId("4f071a10edb28db4864be584"), "fruit" : [ "apple", "banana", "peach" ] }
{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }
{ "_id" : ObjectId("4f071c6076285076f80ca7c8"), "fruit" : [ "apple" ] }
{ "_id" : ObjectId("4f071ce576285076f80ca7c9"), "fruit" : [ "banana", "apple" ] } 

         履行下面的查询:

db.food.find({"fruit":{"$all":["apple","banana"]}});

        能够匹配到下面的三个文档:

{ "_id" : ObjectId("4f071a10edb28db4864be584"), "fruit" : [ "apple", "banana", "peach" ] }
{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }
{ "_id" : ObjectId("4f071ce576285076f80ca7c9"), "fruit" : [ "banana", "apple" ] }

        你或许会说,能够选用准确匹配整个数组的办法如下:

db.food.find({"fruit":["apple","banana"]});

        得到的成果只要一个文档:

{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }

        不必惊奇,这就是准确匹配,连apple和banana呈现的次序都不能互换。这种成果很显然不是许多时分咱们想要的。也是为什么引入$all匹配操作符。

        还有一种匹配的语法:能够运用key.index来匹配指定键对应值(是数组的情况下)的第index+1个元素值。仍是上面生果的那个比方,咱们假定要匹配fruit键对应值第三个元素为peach的文档,咱们能够这么写:

db.food.find({"fruit.2":"peach"});

        留意一点,数组下标是从0开端的。

        假如咱们需求匹配fruit键的值数组元素个数为3个的文档,能够运用$size匹配操作符:

db.food.find({"fruit":{"$size":3}});

        这样也能够将第一个文档匹配出来。可是特别需求留意,$size匹配符是不能和其他的查询条件一起运用的。比方你依照下面写是不会有成果的:

db.food.find({"fruit":{"$gt":{"$size":2}}});

       这是不会匹配出fruit键的值数组元素个数大于2的文档。这样不会有任何查询成果的。

 

《MongoDB:The Definitive Guide》

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2
  • 3
  • 4

    phpMyAdmin的安全问题ITeye

    修正,用户,根目录
  • 5

    MySQL数据交换ITeye

    文件,内容,李四
  • 6
  • 7

    PLITeye

    参数,成果,函数
  • 8
  • 9

    ORACLE DBMSITeye

    参数,用法,检查
  • 10