`
落叶留步
  • 浏览: 53266 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

mongodb基础知识-内嵌数组相关

 
阅读更多

    前面看到mongodb文档的字段的值可以嵌套一个文档,当然字段的值也可以嵌套一个数组。不过嵌套数组就比嵌套文档稍微复杂一些,因为数组既可以是基本数据类型的数组,也可以是文档类型的数组。为了逻辑的顺畅,先从嵌套基本数据类型的数组开始,然后过度到嵌套文档的数组。

    #########################################################################

    基本数据的数组:

    1. 精确匹配  数组中值完全一样,值的顺序也一致

 

// 样例数据
{ "_id" : 1, "score" : [ -1, 3 ] }
{ "_id" : 2, "score" : [ 1, 5 ] }
{ "_id" : 3, "score" : [ 1, 5, 6 ] }
{ "_id" : 4, "score" : [ 5, 6 ] }
{ "_id" : 5, "score" : [ 5, 1 ] }

// 精确查询
db.students.find( { score: [1, 5] } )

// 匹配的只有一个
{ "_id" : 2, "score" : [ 1, 5 ] }

// 下面两个不会匹配  顺序不一样  个数不一样
{ "_id" : 5, "score" : [ 5, 1 ] }
{ "_id" : 3, "score" : [ 1, 5, 6 ] }

   2. 匹配数组单个元素  也就是数据中有一个元素等于查询的这个元素 就返回。

// 样例数据
{ "_id" : 1, "score" : [ -1, 3 ] }
{ "_id" : 2, "score" : [ 1, 5 ] }
{ "_id" : 3, "score" : [ 1, 5, 6 ] }
{ "_id" : 4, "score" : [ 5, 6 ] }
{ "_id" : 5, "score" : [ 5, 1 ] }

// 匹配数组一个元素
db.students.find( { score:  5 } )

// 返回的文档是
{ "_id" : 2, "score" : [ 1, 5 ] }// 5
{ "_id" : 3, "score" : [ 1, 5, 6 ] }// 5
{ "_id" : 4, "score" : [ 5, 6 ] }// 5
{ "_id" : 5, "score" : [ 5, 1 ] }// 5

    3. 匹配数组多个元素  也就是所有的查询条件都可以在数组中找到匹配的元素,可以是单个元素满足所有条件,也可以是多个元素-每个元素只满足一个条件。

// 样例数据
{ "_id" : 1, "score" : [ -1, 3 ] }
{ "_id" : 2, "score" : [ 1, 5 ] }
{ "_id" : 3, "score" : [ 1, 5, 6 ] }
{ "_id" : 4, "score" : [ 5, 6 ] }
{ "_id" : 5, "score" : [ 5, 1 ] }

// 每个条件都有元素可以匹配
db.students.find( { score: { $gt: 0, $lt: 2 } } )

// 返回的文档是
{ "_id" : 1, "score" : [ -1, 3 ] } // 3 -1
{ "_id" : 2, "score" : [ 1, 5 ] }// 1 1
{ "_id" : 3, "score" : [ 1, 5, 6 ] }// 1 1
{ "_id" : 5, "score" : [ 5, 1 ] }// 1 1

   4. 数组单个元素匹配多个条件 注意和上面的区别  这里指的是数组中存在至少一个元素满足所有的条件。

// 样例数据
{ "_id" : 1, "score" : [ -1, 3 ] }
{ "_id" : 2, "score" : [ 1, 5 ] }
{ "_id" : 3, "score" : [ 1, 5, 6 ] }
{ "_id" : 4, "score" : [ 5, 6 ] }
{ "_id" : 5, "score" : [ 5, 1 ] }

// 至少一个元素满足所有条件
db.students.find( { score: { $elemMatch: { $gt: 0, $lt: 2 } } } )


// 返回的文档是
{ "_id" : 2, "score" : [ 1, 5 ] }// 1
{ "_id" : 3, "score" : [ 1, 5, 6 ] }// 1
{ "_id" : 5, "score" : [ 5, 1 ] }// 1

 

   5. 建立索引

// 样例数据
{ _id: 1, item: "ABC", ratings: [ 2, 5, 9 ] }
{ _id: 2, item: "ABC", ratings: [ 3, 8, 9 ] }

// 对ratings字段建立索引
db.survey.createIndex( { ratings: 1 } )

 

    #########################################################################

    嵌套文档的数组:

    

// 样例数据
    {
       _id: 1,
       name: "sue",
       age: 19,
       type: 1,
       status: "P",
       favorites: { artist: "Picasso", food: "pizza" },
       finished: [ 17, 3 ],
       badges: [ "blue", "black" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 85, bonus: 10 }
       ]
     },
     {
       _id: 2,
       name: "bob",
       age: 42,
       type: 1,
       status: "A",
       favorites: { artist: "Miro", food: "meringue" },
       finished: [ 11, 25 ],
       badges: [ "green" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 64, bonus: 12 }
       ]
     },
     {
       _id: 3,
       name: "ahn",
       age: 22,
       type: 2,
       status: "A",
       favorites: { artist: "Cassatt", food: "cake" },
       finished: [ 6 ],
       badges: [ "blue", "red" ],
       points: [
          { points: 81, bonus: 8 },
          { points: 55, bonus: 20 }
       ]
     },
     {
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "red", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
     },
     {
       _id: 5,
       name: "xyz",
       age: 23,
       type: 2,
       status: "D",
       favorites: { artist: "Noguchi", food: "nougat" },
       finished: [ 14, 6 ],
       badges: [ "orange" ],
       points: [
          { points: 71, bonus: 20 }
       ]
     },
     {
       _id: 6,
       name: "abc",
       age: 43,
       type: 1,
       status: "A",
       favorites: { food: "pizza", artist: "Picasso" },
       finished: [ 18, 12 ],
       badges: [ "black", "blue" ],
       points: [
          { points: 78, bonus: 8 },
          { points: 57, bonus: 7 }
       ]
     }

 

    1. 组合元素满足查询条件 对于每一个条件都可以找到嵌套文档匹配

//
db.users.find( { 'points.points': { $lte: 55, "$gt": 80 } } )

//
{
   "_id" : 3,
   "name" : "ahn",
   "age" : 22,
   "type" : 2,
   "status" : "A",
   "favorites" : { "artist" : "Cassatt", "food" : "cake" },
   "finished" : [ 6 ],
   "badges" : [ "blue", "red" ],
   "points" : [ { "points" : 81, "bonus" : 8 }, { "points" : 55, "bonus" : 20 } ]// 55 81
}

 

    2. 单个文档满足多个查询条件 有两种情况 一种是一个字段多个限制  一种是多个字段限制
// 第一种情况
db.users.find( { points: { $elemMatch: { points: { $lte: 70, $gte: 56}} } } )

// 返回
{
    "_id" : 2.0,
    "name" : "bob",
    "age" : 42.0,
    "type" : 1.0,
    "status" : "A",
    "favorites" : {
        "artist" : "Miro",
        "food" : "meringue"
    },
    "finished" : [ 
        11.0, 
        25.0
    ],
    "badges" : [ 
        "green"
    ],
    "points" : [ 
        {
            "points" : 85.0,
            "bonus" : 20.0
        }, 
        {
            "points" : 64.0,// 64
            "bonus" : 12.0
        }
    ]
}

{
    "_id" : 6.0,
    "name" : "abc",
    "age" : 43.0,
    "type" : 1.0,
    "status" : "A",
    "favorites" : {
        "food" : "pizza",
        "artist" : "Picasso"
    },
    "finished" : [ 
        18.0, 
        12.0
    ],
    "badges" : [ 
        "black", 
        "blue"
    ],
    "points" : [ 
        {
            "points" : 78.0,
            "bonus" : 8.0
        }, 
        {
            "points" : 57.0,// 57
            "bonus" : 7.0
        }
    ]
}
   
// 第二种情况
db.users.find( { points: { $elemMatch: { points: { $lte: 70}, bonus: 20 } } } )

// 返回
{
    "_id" : 3.0,
    "name" : "ahn",
    "age" : 22.0,
    "type" : 2.0,
    "status" : "A",
    "favorites" : {
        "artist" : "Cassatt",
        "food" : "cake"
    },
    "finished" : [ 
        6.0
    ],
    "badges" : [ 
        "blue", 
        "red"
    ],
    "points" : [ 
        {
            "points" : 81.0,
            "bonus" : 8.0
        }, 
        {
            "points" : 55.0,// 55
            "bonus" : 20.0// 20
        }
    ]
}
   3. 数组要包含某几类文档 也就有多个$elemMatch
// 意思就是说既要有文档第一个 也要有文档满足第二个
db.users.find( {"$and" : [
        { points: { $elemMatch: { points: { $lte: 70}, bonus: 20 } } },
        { points: { $elemMatch: { points: { $gt: 80}, bonus: 8 } } }
    ]} )

// 返回
{
    "_id" : 3.0,
    "name" : "ahn",
    "age" : 22.0,
    "type" : 2.0,
    "status" : "A",
    "favorites" : {
        "artist" : "Cassatt",
        "food" : "cake"
    },
    "finished" : [ 
        6.0
    ],
    "badges" : [ 
        "blue", 
        "red"
    ],
    "points" : [ 
        {
            "points" : 81.0,
            "bonus" : 8.0
        }, 
        {
            "points" : 55.0,
            "bonus" : 20.0
        }
    ]
}
 
// 也可以这么写 和上面的写法等价
db.users.find( { "points" : {"$all" : [
        { $elemMatch: { points: { $lte: 70}, bonus: 20 } },
        { $elemMatch: { points: { $gt: 80}, bonus: 8 } }
    ]}} )

// 返回
{
    "_id" : 3.0,
    "name" : "ahn",
    "age" : 22.0,
    "type" : 2.0,
    "status" : "A",
    "favorites" : {
        "artist" : "Cassatt",
        "food" : "cake"
    },
    "finished" : [ 
        6.0
    ],
    "badges" : [ 
        "blue", 
        "red"
    ],
    "points" : [ 
        {
            "points" : 81.0,
            "bonus" : 8.0
        }, 
        {
            "points" : 55.0,
            "bonus" : 20.0
        }
    ]
}
 
 

 

 

 

 

分享到:
评论

相关推荐

    MongoDB 使用手册-中文版.docx

    ### MongoDB 使用手册知识点详解 #### 一、MongoDB简介 **功能特点** - **面向文档存储**:MongoDB...这些知识点覆盖了MongoDB的基础介绍、安装配置以及常用的基本命令操作,对于初学者来说是非常有用的参考资料。

    MongoDB知识点学习手册

    ### MongoDB知识点学习手册 #### 一、Mongodb简介 MongoDB 是一个开源的、面向文档存储的数据库系统,属于 NoSQL 数据库的一种。其名称来源于单词 "humongous"(巨大的),表明 MongoDB 设计用于处理大规模的数据...

    MongoDB权威指南(第二版) - 文字版可复制

    第2章:MongoDB基础知识 - 文档:是 MongoDB 中的基本数据单元,以 JSON/BSON 格式存储。 - 集合:文档的容器,可以包含多个文档。 - 动态模式:集合中的文档可以有不同的结构。 - 命名:集合的名称可以是任意 UTF...

    mongodb基础学习

    ### MongoDB基础知识概览 #### MongoDB简介 MongoDB是一款开源、高性能、无模式的文档型数据库管理系统,属于NoSQL数据库的一种。它使用JSON格式的数据结构来存储数据,支持多种数据类型,具备灵活的数据模型,适用...

    MongoDB的基础知识简介

    以下是对MongoDB基础知识的详细阐述: 1. 文档、集合和数据库 - **文档**:MongoDB的核心单位是文档,类似于JSON对象,由键值对构成,键为字符串,不可为空。MongoDB文档支持多种数据类型,包括字符串、数字、数组...

    MongoDB实战 班克

    在“MongoDB实战 班克”这本书中,作者深入浅出地介绍了MongoDB的基础知识以及实践技巧,旨在帮助读者快速掌握MongoDB的使用。 1. MongoDB基础: - 数据模型:MongoDB采用JSON格式的BSON(Binary JSON)作为数据...

    mongodb学习手册

    ### MongoDB学习手册知识点详解 #### 一、MongoDB简介 - **名称来源**:MongoDB的名称来源于英文单词“humongous”,意指其能够处理海量数据的能力。 - **定位**:MongoDB是一款开源的、面向文档存储的NoSQL数据库...

    Mongodb学习手册

    ### MongoDB学习手册知识点详解 #### 一、MongoDB简介 - **名称来源**:MongoDB的名称来源于英文单词“humongous”,意指其能够处理海量数据的能力。 - **定位**:MongoDB是一款开源的、面向文档存储的NoSQL...

    mongodb 学习文档

    本学习文档旨在为初学者提供全面的MongoDB知识,涵盖从基础概念到高级操作的各个方面。 1. MongoDB 概述 1.1 介绍 MongoDB 是一个混合型数据库,融合了文档数据库、键值存储和关系型数据库的特性。它以JSON格式的...

    MongoDB资料shard,oplog等

    ### MongoDB核心知识点解析 #### MongoDB概述 MongoDB是一款高性能、开源、无模式的文档型数据库。作为一款介于关系数据库和非关系数据库之间的解决方案,MongoDB在很多应用场景中可以替代传统的关系型数据库或是...

    MongoDB权威指南(中文版)高清

    1098.1.3 停止MongoDB 1108.2 监控 1108.2.1 使用管理接口 1108.2.2 serverStatus 1128.2.3 mongostat 1138.2.4 第三方插件 1138.3 安全和认证 1148.3.1 认证的基础知识 1148.3.2 认证的工作原理 ...

    电子书:MongoDB权威指南(中文版)

    1078.1.2 配置文件 1098.1.3 停止MongoDB 1108.2 监控 1108.2.1 使用管理接口 1108.2.2 serverStatus 1128.2.3 mongostat 1138.2.4 第三方插件 1138.3 安全和认证 1148.3.1 认证的基础知识 1148.3...

    mongodb学习手册.pdf

    MongoDB学习手册提供了大量的基础知识点和操作指导,对于理解MongoDB的架构、安装、数据类型、索引、同步、分片、安全性、常用操作以及图形化管理工具等方面都有很大的帮助。通过对这些内容的学习,可以快速掌握...

    MongoDB 4系列(1)概述与安装和资源介绍

    MongoDB 4系列的概述与安装教程主要涵盖了MongoDB的基础知识、主要特点、云数据库的使用,以及一些常用的MongoDB工具。MongoDB是一款强大的、基于分布式文件存储的文档型数据库,采用C++语言开发,其设计目标是为Web...

    gurukul:技能提升的科学

    ### JavaScript基础知识 1. **变量与数据类型**:JavaScript是动态类型的,允许在运行时声明和改变变量的数据类型。基础数据类型包括字符串、数字、布尔值、null、undefined和symbol(ES6新增)。 2. **控制结构**...

Global site tag (gtag.js) - Google Analytics