MongoDB常用操作介绍

大部分人用数据库可能还是MySQL,Oracle等关系型数据库,但最近几年文档型数据库也慢慢进入大众视野,自己也在一些业务上使用,发现如果你的业务的核心数据结构是定义成JSON类型的话,文档型数据库天然就适合操作JSON,性能比关系型数据库好不知道多少倍,今天就介绍自己比较熟悉的文档型数据库MongoDB的一些基本操作。

概述

MongoDB是一个非关系型数据库,采用文档存储模型。在MongoDB中,数据以BSON(二进制JSON)格式存储,每个文档是一个键值对的有序集合。MongoDB的文档概念包括以下几个要点:

  1. 文档结构:MongoDB的文档是一个类似于JSON的结构,由字段和对应的值组成。字段可以是任意的数据类型,包括字符串、整数、浮点数、布尔值、日期、数组和嵌套文档等。
  2. 唯一标识:每个文档都有一个唯一的_id字段,用于唯一标识该文档。如果不指定_id字段,MongoDB会自动生成一个唯一的ObjectId。
  3. 集合:文档的集合被称为集合(Collection),类似于关系型数据库中的表。每个集合可以包含多个文档,每个文档可以有不同的结构。
  4. 数据库:MongoDB的文档组织在数据库(Database)中。一个MongoDB服务器可以包含多个数据库,每个数据库可以包含多个集合。
  5. 索引:MongoDB支持创建索引来加快查询操作的速度。索引可以基于单个字段或多个字段,能够有效地提高查询效率。
  6. 查询语言:MongoDB使用查询语言来操作数据,支持丰富的查询操作,包括查找、排序、过滤、限制返回结果数量等。

总的来说,MongoDB的文档概念是以灵活的文档模型来存储数据,使得开发人员能够更方便地处理非结构化或半结构化数据,并且能够适应快速变化的数据模式。

下面我们假设有一个名为testJson的文档集合,里面有个Mixed类型的字段名为jsonField,并往里面插入如下json,现在对它进行增删改查的操作。

{
    "school":"NO.1 Primary School",
    "class" : {
        "grade" : "three",
        "studentCount" : 30,
        "teacher" : {
            "name" : "John",
            "gender" : "male"
        }
    },
    "students" : [ 
        {
            "name" : "Jack",
            "gender" : "male",
            "age":13
        }, 
        {
            "name" : "Tom",
            "gender" : "male",
            "age":13
        }, 
        {
            "name" : "Marry",
            "gender" : "female",
            "age":14
        }
    ],
}

增加一个文档

db.getCollection('testJson').insertMany([
{
  "jsonField":{
    "school":"NO.1 Primary School",
    "brief":"good class",
    "class" : {
        "grade" : "three",
        "studentCount" : 30,
        "teacher" : {
            "name" : "John",
            "gender" : "male"
        }
    },
    "students" : [ 
        {
            "name" : "Jack",
            "gender" : "male",
            "age":13
        }, 
        {
            "name" : "Tom",
            "gender" : "male",
            "age":13
        }, 
        {
            "name" : "Marry",
            "gender" : "female",
            "age":14
        }
    ],
}
}
]);
插入一条数据

往json里新增一个一级字段

db.getCollection('testJson').update({_id:ObjectId("654f7785c97974cb84f9f874")}, { $set: { "jsonField.headMaster": "William" } })

往json里的数组新增一个元素

db.getCollection('testJson').update({_id:ObjectId("654f7785c97974cb84f9f874")}, { $push: { "jsonField.students": { "name": "Cindy", "gender": "female","age":13 } } })

根据一级字段查询

db.getCollection('testJson').find({"jsonField.school": "NO.1 Primary School"}, {"jsonField.students":1})

查询数组里的元素

我们往集合里新增一个文档如下,然后查询有名为Jack学生的文档

db.getCollection('testJson').find({"jsonField.students": {$elemMatch:{"name":"Jack"}}}, {"jsonField.headMaster":1})

修改字段内容

db.getCollection('testJson').updateMany({},{$set:{"jsonField.headMaster": "Terry"}})

上述修改把所有文档的headerMaster都改成Terry

修改数组元素

db.getCollection('testJson').updateOne({"jsonField.class.grade":"three"},{$set:{"jsonField.students.$[index].name": "David"}},{arrayFilters:[{"index.name": "Jack"}]})

以上方法把jsonField.class.grade为three的文档里的students里名为Jack的学生改成David,这里用到arrayFilters来过滤数组元素。

删除一级字段

db.getCollection('testJson').updateOne({"jsonField.class.grade":"three"},{$unset:{"jsonField.headMaster": 1}})

以上方法把jsonField.class.grade为three的文档里的headMaster字段去掉,用到了unset方法。

删除数组里的元素

db.getCollection('testJson').updateOne({"jsonField.class.grade":"three"},{$pull:{"jsonField.students": {"name":"Tom"}}})

以上方法把jsonField.class.grade为three的文档里的students里name为Tom的元素去掉,具体使用到了$pull这个关键字。

 

 

以上基本就是MongoDB增删改查的基本用法,针对JSON这样的数据类型MongoDB以BSON格式存储的特质保证对JSON的任何操作都有极高的效率,同时增删改查的语句也更好书写,后续会有MySQL对JSON的处理介绍,大家可以对比两种数据库对JSON处理的性能以及书写语句的简洁性。

关于chenzujie

非著名码农一枚,认真工作,快乐生活
此条目发表在数据库分类目录。将固定链接加入收藏夹。

MongoDB常用操作介绍》有一条回应

  1. Pingback引用通告: MySQL JSON操作介绍 - 陈祖杰的blog陈祖杰的blog

发表评论

邮箱地址不会被公开。 必填项已用*标注