简介
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
下面是Sql与mongodb的术语对比
插入数据
首先我们先创建一个名字为test_data_1
的集合
db.get Collection('test_data_1').insertOne(
{
"name":888,
"address":"changsha"
}
)
当然,将这一条语句写成一行也是没有问题的。其中,Key(也就是上面的name和address)是可以不带引号的,同时对于字符串也可以使用单引号,不过为了统一,在后面统一使用双引号。
下面是执行这一条数据返回的结果
{
"acknowledged" : true,
"insertedId" : ObjectId("5d5f9e5c0336f9e82b3f9d74")
}
其中acknowledged代表数据是否被承认。其中,每一条数据被插入的时候都会返回一个字段“_id”,也就是ObjectId,它是由时间、机器码、进程pid和自增计数器构成的。“_id”始终递增,并绝对不重复。
插入多个文档
mongodb也同时支持一次插入多个文档
db.getCollection('test_data_1').insertMany([
{
"name":"名字1",
},
{
"name":"名字2",
},
{
"address":"湖南"
},
]
)
这里我们又可以想一想,我们是否可以使用insertOne实现insertMany的功能?肯定是可以的,但是会造成什么影响呢?我们可以从网络带宽,磁盘IO,机器性能,以及稳定性来考虑。
在插入相同大小的数据时,使用insertMany的性能要明显好于insertOne,因为insertOne会频繁的调用去插入数据,而insertMany却只会调用一次。如果mangodb数据库与调用者不在同一台机器上,那么性能相差便会更大,因为数据在网络传输的过程中会添加其他的报文。那么插入数据的时候是不是应该将数据全部一次插入呢?也不是!!试想一下,如果插入的数据过多,将磁盘的IO占满了,那么必会对其他程序造成影响。并且,如果在快要插入完所有数据的时候,服务器断电了,那么……所以说,应该合理的选择一次性插入数据库的数量。
查询数据
查询所有数据
db.getCollection('test_data_1').find({})
其中{}里面包含的是查询条件,因为是查询所有的数据,所以直接为空就行了,或者省略{}也行。
查询特定的数据
db.getCollection('test_data_1').find({"字段1":"固定值1","字段2":"固定值2"})
查询范围值数据
下面是查询i范围值的语法,至于操作符,我们后面再说。
db.getCollection('test_data_1').find(
{
"字段1":{"操作符1":边界1,"操作符2":边界2},
"字段2":{"操作符1":边界1,"操作符2":边界2}
}
)
修改数据
修改数据的前一部分是需要找到数据,然后才能进行修改。同样,在mongodb中,有两种方法修改数据(实际上有很多种)
- updateOne:只更新第一条符合条件的数据
- updateMany:更新所有符合条件的数据
下面介绍updateMany的更新数据
db.getCollection('test_data_1').updateMany(
// 下面是查询条件
{
"字段名1":"查找条件1","字段名2":"查找条件2"
},
// 进行修改
{
"$set":{"字段名":"新的数据","字段名":"新的数据"}
}
)
其中,如果在进行在进行修改的步骤中,如果字段名以前不存在则会进行增添。
当然,更新数据的内容不可能就这么一点点,但是因为这仅仅是一个基础入门教程,其他的就拜拜吧!想了解更多可以去看看其他的教程。
删除数据
删除数据也有两种操作,deleteOne和deleteMany。和修改数据的情况差不多,一个是删除第一条满足条件的,一个是删除所有满足条件的。
还是以deleteMany来说:
db.getCollection('test_data_1').deleteMany(
// 删除的条件
{
"字段名1":"值","字段名2":"值2"
}
)
数据去重
在mongodb中进行数据去重是一个很简单的操作。使用distinct即可。它可以接收两个参数,第一个参数为需要被去重的字段名,第二个参数是进行去重的条件(去重条件也就是进行查询操作的第一个参数,可以省略)。
db.getCollection('test_data_1').distinct(去重的字段名,去重的条件)
下面举个例子:
db.getCollection('test_data_1').distinct("name",{"age":{"$ne":10}})
这个的含义就是,在age不等于10的条件下对name字段进行去重!那么返回的数据是什么呢?是一个数组,里面是去重后的表中name字段的非重复的数据。