欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

梭哈Mongodb常用操作

程序员文章站 2024-03-19 09:17:10
...

本文首发于博主公众号LISTONE,欢迎关注哦!

梭哈Mongodb常用操作

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'})

梭哈Mongodb常用操作

查询范围值数据

db.getCollection('listone').find(
	 {
        "字段1":{"操作符1":边界1,"操作符2":边界2},
     	"字段2":{"操作符1":边界1,"操作符2":边界2}
    }
)

db.getCollection('listone').find({age:{"$gt":22}})

梭哈Mongodb常用操作

和前面查询特定的数据的方法一样,只不过固定值变成了范围({"$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})

梭哈Mongodb常用操作

  • 只返回age
db.getCollection('listone').find({age:{"$gt":22}},{"age":1})

梭哈Mongodb常用操作

大家会发现,在后面的用于限定的条件中,如果age为1,则返回了 age_id ,如果age为0,则返回了 _idname 。在不考虑_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字段的非重复的数据。

梭哈Mongodb常用操作