• 技术文章 >数据库 >mysql教程

    MongoDB的常用Query操作的介绍(附代码)

    不言不言2019-03-23 16:39:59转载2204
    本篇文章给大家带来的内容是关于MongoDB的常用Query操作的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    前言:使用的可视化工具是 Studio 3T,官网-->https://studio3t.com/
    版本号:MongoDB shell version v3.4.2
    如何使用:https://blog.csdn.net/weixin_...
    看点:重点看操作符那块。
    如何查找:在此页面按 ctrl+F 输入关键字查找

    一、常用Query
    为方便操作,在插入原数据前,先删除所有文档(在项目中请谨慎操作!):

    db.getCollection("inventory").deleteMany({})

    0、查看所有文档

    db.getCollection("inventory").find({})

    1、对象查找
    1.1、原数据

    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" }
    ]);

    1.2、查找 size.h 等于 14,size.w 等于 21,size.uom 等于 cm 的文档

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

    1.3、查找 size.uom 等于 in 的文档

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

    注意:当查找单个对象属性时,务必加上引号!

    1.4、查找并返回对象里的指定字段

    db.inventory.find(
       { status: "A" },
       { item: 1, status: 1, "size.uom": 1 }
    )

    1.5、查找并过滤对象里的指定字段

    db.inventory.find(
       { status: "A" },
       { "size.uom": 0 }
    )

    2、数组查找
    2.1、原数据

    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 ] }
    ]);

    2.2、查找 tags=["red", "blank"] 的文档

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

    注意:不是包含关系,即 tags: ["red", "blank", "plain"] 是不包括在内的

    2.3、查找 tags 包含 red 的文档

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

    注意:不能这么写 db.inventory.find( { tags: ["red"] } ),这样就表示查找 tags 是 red 的文档

    3、数组中包含对象的查找
    3.1、原数据

    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 } ] }
    ]);

    3.2、查找数组中有一个对象符合条件的(不是包含),只要数组中有一个对象符合条件就返回整个数组

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

    要严格按照字段的顺序来,如果调换字段顺序会 找 不 到,如下:

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

    3.3、查找数组中的元素对象,有一个元素对象的qty=5,或者该对象(或者是其他元素对象)的warehouse=A

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

    3.4、查找数组中的对象,并返回对象的某个属性

    db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

    4、普通查找
    4.1、原数据

    db.inventory.insertMany( [
      { item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
      { item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
      { item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
      { item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
      { item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
    ]);

    4.2、查询并返回指定字段
    在 status=A 的条件下,返回 _id,item,status 字段

    db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

    结果:

    { "_id" : ObjectId("5c91cd53e98d5972748780e1"), 
        "item" : "journal", 
        "status" : "A"}
    // ----------------------------------------------
    { "_id" : ObjectId("5c91cd53e98d5972748780e2"), 
        "item" : "notebook", 
        "status" : "A"}
    // ----------------------------------------------
    { "_id" : ObjectId("5c91cd53e98d5972748780e5"), 
        "item" : "postcard", 
        "status" : "A"}

    4.3、由 4.2 可知,_id 是自动带着的,可以去掉,如下
    查询不带(去掉) id :

    db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )

    注意:除了 id 可以在过滤掉的同时,还去保留其他字段外,其他字段不能在 0 的同时,还写 1
    如:

    db.inventory.find( { status: "A" }, { item: 1, status: 0 } )

    会报错

    5518628-9f9c494930a74ccc.png

    4.4、排除特定字段,返回其他字段

    db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

    5、查找 null 或不存在的 键
    5.1、原数据

    db.inventory.insertMany([
       { _id: 1, item: null },
       { _id: 2 }
    ])

    5.2、查找 item 为 null 的文档,或者不包含 item 的文档

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

    二、操作符
    1、$lt less than 小于
    1.1、原数据

    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" }
    ]);

    1.2、查找 "size.h" 小于 15 的文档集合

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

    1.3、$lt 与 AND 联用
    查找 size.h 小于 15,并且 size.uom 是 in ,并且 status 是 D 的文档

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

    2、$lte less than equal 小于等于
    2.1、原数据

    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 } ] }
    ]);

    2.2、查找 instock.qty 小于等于 20 的文档,只要数组中有一个对象符合条件就返回整个数组

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

    3、$gt greater than 大于
    3.1、原数据

    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 ] }
    ]);

    3.2、查找 dim_cm 大于 25 的文档

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

    注意:只要包含大于 25 的元素的数组,都是符合条件的

    3.3、查找 dim_cm 大于 15,或小于 20,或既大于 15,又小于 20 的文档

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

    3.4、查找 dim_cm 既大于 22,又小于 30 的文档(是判断数组的某一个元素是否是大于22,且小于30的,而不是判断数组的所有元素)

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

    3.5、根据数组位置查找
    查找 dim_cm 的第二个元素 大于 25 的文档

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

    4、$size 根据数组长度查找
    查找 tags 长度是 3 的文档

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

    5、$gte 大于等于
    5.1、原数据

    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 } ] }
    ]);

    5.2、查找数组的第一个元素(对象)的qty 大于等于 20 的文档集合

    db.inventory.find( { 'instock.0.qty': { $gte: 20 } } )

    6、$elemMatch 对象的属性匹配
    6.1、在数组中查找符合 qty=5, warehouse="A" 的对象,并返回该文档集合

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

    6.2、在数组中查找符合 qty 大于 10 并且小于等于 20 的文档集合

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

    如果不使用 $elemMatch 的话,就表示 qty 大于 10 或者小于等于 20,官方文档意思是,不在数组的某一个元素找 既满足条件 A 又满足条件 B 的 qty,而是在数组的所有元素上找,满足条件 A 或满足条件 B 的 qty

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

    7、$slice 返回数组特定位置的元素
    7.1、原数据

    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 ] }
    ]);

    7.2、查找并返回 tags 数组的最后一个元素

    db.inventory.find( { item: "journal" }, { item: 1, qty: 0, tags: { $slice: -1 } } )

    结果:

    { 
        "_id" : ObjectId("5c91dce5e98d5972748780e6"), 
        "item" : "journal", 
        "tags" : [
            "red"
        ]
    }

    8、$type 返回指定类型的元素
    8.1、原数据

    db.inventory.insertMany([
       { _id: 1, item: null },
       { _id: 2 }
    ])

    8.2、返回 null 类型的数据

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

    类型如下:

    5518628-977fce936fee345b.png

    详细文档请看:https://docs.mongodb.com/manu...

    9、$exists 返回存在/不存在的键
    查找不存在 item 键的数据

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

    10、$all 包含
    10.1、原数据

    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 ] }
    ]);

    10.2、查找 tags 数组包含 ["red", "blank"] 的文档

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

    综上:
    数组用的:$all$size$slice
    对象用的:$elemMatch

    Query查询的详细文档请看:https://docs.mongodb.com/manu...
    Operator的详细文档请看:https://docs.mongodb.com/manu...

    本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的mongodb视频教程栏目!

    以上就是MongoDB的常用Query操作的介绍(附代码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:mongodb
    上一篇:mgo指定字符串长度查找数据的方法介绍(代码) 下一篇:Docker部署Nginx+Flask+Mongo的应用介绍(附代码)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• MongoDB中数组类型的操作(代码示例)• windows下mongoDB的环境配置教程详解• 如何在MongoDB中创建和删除数据库• 如何备份,还原和迁移MongoDB数据库
    1/1

    PHP中文网