【无标题】Mongo Shell 查询操作

Mongo Shell 查询操作

mongodb 查询嵌入式文档数组

  • 返回/不返回嵌套字段中的指定字段:

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

    嵌套字段可通过 . 来获取。

  • 返回数组中指定的元素

    db.collection.find({"_id" : ObjectId("621d8f04a932fa682cea2aa0")}, {"connect_tasks":{"$slice":-1}})

    $slice作用于数组字段。

  • 查询嵌数组内的嵌套文档

    db.inventory.insertMany( [
       { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
       { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
       { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
       { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
       { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 }, { warehouse: "A", qty: 45 } ] }
    ]);
    
    • 以嵌套文档为匹配条件

      db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

      以文档为查询条件,返回所有数组内包含条件文档的集合文档

      注意查询条件中嵌套文档内字段的顺序和数据库中嵌套文档的顺序也要保持一致,

      db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )的查询结果为空。

    • 指定数组内嵌套文档的字段

      以数组内文档内的某个字段为查询条件

      db.inventory.find( { ‘instock.qty’: { $lte: 20 } } )

      返回集合中所有满足数组内至少有一个文档的qty字段大于等于1的文档。

    • 指定数组内某一个嵌套文档的字段

      使用点号指明具体是数组的第几个嵌套文档的字段,确保索引和字段正确

      db.inventory.find( { ‘instock.0.qty’: { $lte: 20 } } )

      返回集合中所有满足数组的第一个嵌套文档的qty值>=1的文档。

    • 指定嵌套文档的多字段进行查询

      • 单个文档的字段满足多个查询条件

        通过使用*$elemMatch操作符为文档指定多个查询条件,则要求返回的集合文档的数组中至少有一个嵌套文档满足所有的查询条件**,即返回的是所有查询条件结果的交集*

        db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )

        返回的是所有满足数组包含至少一个条件文档的集合文档

        { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] }
        

        db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )

        返回的是所有满足数组内至少有一个文档的qty元素大于10且小于等于20的集合文档

      • 多个元素联合满足查询条件

        如果对数组内文档的联合查询没有使用$elemMatch,查询返回数组中存在多个元素联合满足所有查询条件的集合文档

        db.inventory.find( { "instock.qty": { $gt: 40, $lte: 20 } } )

         { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
           { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 }, { warehouse: "A", qty: 45 } ] }
        

        注:第一条数据是qty=60满足了条件 g t : 40 , q t y = 15 满 足 了 条 件 gt:40,qty=15满足了条件 gt:40qty=15lte:20;第二条数据是qty=15满足了条件 l t e : 20 , q t y = 45 满 足 了 条 件 lte:20,qty=45满足了条件 lte:20qty=45gt:40。所以返回了这两条数据,插入的其他数据的嵌套文档均不能同时满足所有的查询条件,所以没有返回

        db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )

        { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
        { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] }   
        

        注:返回的第一条数据,文档{ warehouse: “A”, qty: 5 }满足了查询条件;第二条数据,文档{ warehouse: “A”, qty: 40 }, { warehouse: “B”, qty: 5 }联合满足了查询条件,可观察其他的插入数据,其他的数据的嵌套文档不能联合满足查询条件

        返回的是所有数组内至少一个文档包含qty=5或者最少一个文档包含warehouse=A的集合文档,相当于是两个查询条件的并集

mongodb 查询数组

  • 练习用数据

    db.inventory.insertMany([
       { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
       { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
       { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
       { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
       { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
        ,
       { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 17] }
    ]);
    
  • 查询数组

    直接对数组字段进行匹配,分为两种情况,一种是严格限制数组只包含查询的元素以及元素顺序;一种是数组的元素包含查询的元素且不限制元素的顺序或是否有其他元素,需要操作符*$all***

    db.inventory.find( { tags: ["red", "blank"] } )

    { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] }
    

    db.invemtory.find({tags:{$all:["red","blank"]}})

    { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
    { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
    { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
    { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
    
  • 查询数组中的元素

    检索数组中至少有一个元素等于指定的值

    db.inventory.find({tags:"red"})

    { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
    { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
    { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
    { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
    

    返回tags数组中至少有一个red元素的文档

    db.inventory.find({ dim_cm : {$gt: 25} })

    { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
    
  • 多条件查询数组中的元素

    使用多条件查询数组时有两种情况:一是指定单个数组元素满足查询条件;二是多个数组中的元素联合满足查询条件

    多条件查询数组元素,即数组中存在一个元素或多个元素能使得所有查询条件都被满足,相当于是拆分所有查询条件后,查询结果的交集

    db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )

    { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
    { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
    { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
    { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] },
    { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 17] }
    

    数组中的单个元素同时满足多个查询条件,即数组中至少存在一个元素同时满足所有的查询条件,使用操作符 $elemMatch

    db.inventory.find({dim_cm : {$elemMatch :{$gt: 23, $lt: 30}}})

    { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
    
  • 使用元素下标查询数组

    db.inventory.find({ "dim_cm.0" : {$gt : 20}})

    { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] }
    

    确保索引和字段正确

  • 通过数组的大小来查询

    使用 $size 操作符,此操作符参数只能是数字

    db.inventory.find({"tags" : {$size : 3)

    { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] }
    

mongodb 查询空字段或缺少字段

  • 练习用数据

    db.inventory.insertMany([
       { _id: 1, item: null },
       { _id: 2 }
    ])
    
  • 等值匹配

    使用 {item : null} 作为匹配条件,返回的是item字段不存在或者item字段存在但是值为null的文档

    db.inventory.find({item : null})

    { _id: 1, item: null },
    { _id: 2 }
    
  • 类型检查

    BSON Types — MongoDB Manual

    null 的 BSON TYPE 是数字 10

    db.inventory.find({ item : { $type : 10} })

    { _id: 1, item: null },
    

    此查询结果只返回item字段存在且值为null的文档

  • 存在检查

    db.inventory.find({ item : { $exists : false }})

    { _id: 2 }
    

    db.inventory.find({ item : { $exists : true }})

    { _id: 1, item: null }
    

    存在检查使用操作符 $exists , 参数为true/false,只判断字段是否存在,不关心字段的值,并返回符合要求的文档

mongodb 查询嵌入/嵌套文档

  • 练习数据

    db.inventory.insertMany( [
       { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
       { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
       { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
       { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
       { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
    ]);
    
  • 嵌套文档等值查询

    对整个文档字段进行等值查询时,需要保证嵌套文档的字段不能缺失,且嵌套文档字段的顺序需要和数据库中嵌套文档的字段顺序保持一致

    db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

    { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }
    

    db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } )是不会有返回值的。

  • 嵌套文档中字段查询

    • 对嵌套文档的字段等值查询

      db.inventory.find( { "size.uom": "in" } )

      { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
      { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }
      

      返回所有嵌套文档的uom字段为 in 的集合文档

    • 对嵌套文档的操作符查询

      db.inventory.find( { "size.h": { $gt: 15 } } )

      { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }
      

      返回所有嵌套文档size中字段h的值大于15的文档

    • 对嵌套文档中的字段进行多条件查询

      db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )

      { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值