大部分人用数据库可能还是MySQL,Oracle等关系型数据库,但最近几年文档型数据库也慢慢进入大众视野,自己也在一些业务上使用,发现如果你的业务的核心数据结构是定义成JSON类型的话,文档型数据库天然就适合操作JSON,性能比关系型数据库好不知道多少倍,今天就介绍自己比较熟悉的文档型数据库MongoDB的一些基本操作。
概述
MongoDB是一个非关系型数据库,采用文档存储模型。在MongoDB中,数据以BSON(二进制JSON)格式存储,每个文档是一个键值对的有序集合。MongoDB的文档概念包括以下几个要点:
- 文档结构:MongoDB的文档是一个类似于JSON的结构,由字段和对应的值组成。字段可以是任意的数据类型,包括字符串、整数、浮点数、布尔值、日期、数组和嵌套文档等。
- 唯一标识:每个文档都有一个唯一的_id字段,用于唯一标识该文档。如果不指定_id字段,MongoDB会自动生成一个唯一的ObjectId。
- 集合:文档的集合被称为集合(Collection),类似于关系型数据库中的表。每个集合可以包含多个文档,每个文档可以有不同的结构。
- 数据库:MongoDB的文档组织在数据库(Database)中。一个MongoDB服务器可以包含多个数据库,每个数据库可以包含多个集合。
- 索引:MongoDB支持创建索引来加快查询操作的速度。索引可以基于单个字段或多个字段,能够有效地提高查询效率。
- 查询语言: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处理的性能以及书写语句的简洁性。
Pingback引用通告: MySQL JSON操作介绍 - 陈祖杰的blog陈祖杰的blog