本文首发于博主公众号LISTONE,欢迎关注哦!
Mongodb简介
Mongodb是一种非关系性数据库(nosql)。
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
下面是sql与mongodb术语对比:
SQL | Mongodb |
---|---|
表(Talbe) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象ID(ObjectID) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文档(Embeded Document) |
数组(Array) | 数组(Array) |
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
{"name": "listone", "age": 22}
以上文档中有一个name键,其值为 listone
,age键值为 22
。
以这个文档为例,解释一下:
- 文档中的键值对是有序的,上面例子中如果调换name和age的键值对,将会被视为一个新的文档。
- 文档中的值不仅仅只限于字符串形式,还有其他更高级的类型。
- 文档的键使用
UTF-8
字符。其中.
和$
通常被保留,只有在特定环境下使用,_
也是保留的。
集合是文档集,其区别于关系数据库的表。并且集合是无模式的,即不同类型的文档可以共存于同一个集合中:
{"name": "listone", "age": 22}
{"book": "The old man and the Sea"}
上面的文档是完全不同的两个文档。既然一个集合可以容纳各种类型,为何需要多集合?
使用多集合的意义在于:
- 降低熵值。即减少混乱程度。
- 速度上的优越性。把一个特定类型的文档分成多个子集合提高查询效率。
- 把同种类型的文档存在一个集合汇总,使数据更集中。
Mongodb数据库操作
创建数据库
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
- 查看所有数据库
show dbs
删除数据库
db.dropDatabase()
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
创建集合
db.createCollection("listone")
- 查看已有集合
show collections
show tables
删除集合
db.collection.drop()
命令中collection替换为要删除的集合名称
插入文档
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany(document_list)
- 示例
>db.listone.insert({name:'listone',
age:22
})
>db.listone.insertOne({name:'li',
age:22
})
>db.listone.insertMany([
{name:'stone',age:28},
{name:'st',age:21}
])
>db.listone.find()
{ "_id" : ObjectId("5e7b83432e8c80cabc4a93c6"), "name" : "listone", "age" : 22 }
{ "_id" : ObjectId("5e7b85082e8c80cabc4a93c7"), "name" : "li", "age" : 22 }
{ "_id" : ObjectId("5e7b85592e8c80cabc4a93c8"), "name" : "stone", "age" : 28 }
{ "_id" : ObjectId("5e7b85592e8c80cabc4a93c9"), "name" : "st", "age" : 21 }
查询数据
查询所有数据
db.getCollection('listone').find({})
其中{}里面包含的是查询条件,因为是查询所有的数据,所以直接为空就行了,或者省略{}也行。
查询特定数据
db.getCollection('listone').find({"字段1":"固定值1","字段2":"固定值2"})
db.getCollection('listone').find({name:'listone'})
查询范围值数据
db.getCollection('listone').find(
{
"字段1":{"操作符1":边界1,"操作符2":边界2},
"字段2":{"操作符1":边界1,"操作符2":边界2}
}
)
db.getCollection('listone').find({age:{"$gt":22}})
和前面查询特定的数据的方法一样,只不过固定值变成了范围({"$gt":22}代表大于22)
操作符及其意义:
操作符 | 意义 |
---|---|
$gt | 大于(great than) |
$gte | 大于等于(great than equal) |
$lt | 小于(less than) |
$lte | 小于等于(less than equal) |
$ne | 不等于(not equal) |
限定返回字段
前面的示例中都返回了所有的字段,下面我们将对某些不需要的字段进行筛选。
db.getCollection('listone').find(用于过滤的条件,用于限定的条件)
- 去除age
db.getCollection('listone').find({age:{"$gt":22}},{"age":0})
- 只返回age
db.getCollection('listone').find({age:{"$gt":22}},{"age":1})
大家会发现,在后面的用于限定的条件中,如果age为1,则返回了 age 和 _id ,如果age为0,则返回了 _id 和 name 。在不考虑_id的情况下,我们可以理解:
如果某一个字段被限定为0,则代表该字段不返回(也就是默认其它字段为1),所以其他未被限定的字段则一定会被返回
如果某一个字段被限定为1,则代表该字段返回(也就是默认其它字段为0),所以其他未被限定的字段则不会被返回
修饰返回结果
- 得到数据的条数
db.getCollection('listone').find({}).count()
- 限定返回结果数量
db.getCollection('test_data_1').find({}).limit(限制返回的数量)
- 对结果进行排序
db.getCollection('test_data_1').find({}).sort({"字段名":-1或者1})
其中-1为逆序,1为正序。
修改数据
- updateOne:只更新第一条符合条件的数据
- updateMany:更新所有符合条件的数据
使用updateMany更新数据
db.getCollection('listone').updateMany(
// 下面是查询条件
{
"字段名1":"查找条件1","字段名2":"查找条件2"
},
// 进行修改
{
"$set":{"字段名":"新的数据","字段名":"新的数据"}
}
)
删除数据
- deleteOne
- deleteMany
db.getCollection('listone').deleteMany(
// 删除的条件
{
"字段名1":"值","字段名2":"值2"
}
)
数据去重
db.getCollection('test_data_1').distinct(去重的字段名,去重的条件)
示例:
db.getCollection('listone').distinct("name",{"age":{"$ne":22}})
这个的含义就是,在age不等于22的条件下对name字段进行去重。返回的数据是一个数组,里面是去重后的表中name字段的非重复的数据。