梭哈Mongodb常用操作

本文首发于博主公众号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,则返回了 _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常用操作)