MongoDB系列-操作

TomTao626 于 2020-06-02 发布
🥰本站访客数 👀本文阅读量

数据库相关概念

SQL概念 MongoDB概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
primary key primary key 主键,MongoDB自动将_id字段设置为主键

进入mongo命令行

$ mongo

选择(切换)数据库

> use admin

创建用户并验证

> db.createUser({user:'tomtao626', pwd:'pwd1234', roles:[{role:'root',db:'admin'}]})

创建数据库

使用use [数据库名称] 命令并插入数据就会创建一个数据库

# 创建数据库test
> use test
# 插入数据
> db.article.insert({title:'MongoDB 教程',desc:'MongoDB是一个nosql数据库',by:'andy',url:'https://www.mongodb.com',tags:['mongodb','nosql','database'],likes:9527})
# 插入成功会返回 WriteResult({ "nInserted" : 1 })
# 查看所有的数据库
> show dbs
# admin   0.000GB
# config  0.000GB
# local   0.000GB
# test    0.000GB

删除数据库

使用db对象中的dropDatabase()方法来删除

> use test
> db.dropDatabase()
# 删除成功会返回 { "dropped" : "test", "ok" : 1 }

查看所有的数据库

> show dbs
# admin   0.000GB
# config  0.000GB
# local   0.000GB

集合操作

  • 创建集合,使用db对象中的createCollection()方法来创建集合,例如创建一个article集合
> use test;
# switched to db test
> db.createCollection("article");
# { "ok" : 1 }
> show collections;
# article
  • 删除集合,使用collection对象的drop()方法来删除集合,例如删除一个article集合
> db.article.drop()
# 删除成功会返回 true

文档操作

插入

  • 使用collection对象的insert()方法来插入文档,语法如下
db.collection.insert(document)
  • 例如插入一个article文档
> db.article.insert({title:'MongoDB 教程',desc:'MongoDB是一个nosql数据库',by:'andy',url:'https://www.mongodb.com',tags:['mongodb','nosql','database'],likes:9527})
# 插入成功会返回 WriteResult({ "nInserted" : 1 })

更新

  • 通过collection对象的update()来更新集合中的文档,语法如下:
db.collection.update(
   <query>,
   <update>,
   {
     multi: <boolean>
   }
)
# query:修改的查询条件,类似于SQL中的WHERE部分
# update:更新属性的操作符,类似与SQL中的SET部分
# multi:设置为true时会更新所有符合条件的文档,默认为false只更新找到的第一条
  • 将title为MongoDB 教程的所有文档的title修改为MongoDB
> db.article.update({'title':'MongoDB教程'}, {$set:{'title':'MongoDB'}}, {multi:true})

  • 除了update()方法以外,save()方法可以用来替换已有文档,语法如下
db.collection.save()
  • ObjectId60e2a42cc76338ee56d30e4a的文档的title改为MongoDB 教程
    db.article.save({"_id":ObjectId("60e2a42cc76338ee56d30e4a"),
    "title":"MongoDB 教程",
    "desc":"MongoDB是一个nosql数据库",
    "by":"tomtao626",
    "url":"https://www.mongodb.com",
    "tags":[
        "mongodb",
        "nosql",
        "database"
       ],
    "likes":9527})
    # 修改成功会返回 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    

删除

  • 通过collection对象的remove()方法来删除集合中的文档,语法如下
db.collection.remove(
   <query>,
   {
     justOne: <boolean>
   }
)
# query:删除的查询条件,类似于SQL中的WHERE部分
# justOne:设置为true只删除一条记录,默认为false删除所有记录
  • 删除titleMongoDB 教程的所有文档
> db.article.remove({'title':'MongoDB 教程'})
# 删除成功会返回 WriteResult({ "nRemoved" : 0 })

查询

  • 使用collection对象的find()方法可以获取文档,语法如下
db.collection.find(query, projection)
# query:查询条件,类似于SQL中的WHERE部分
# projection:可选,使用投影操作符指定返回的键
  • 获取所有的article文档,可以加一个pretty参数,将返回结果格式化一下
> db.article.find({}).pretty()
# {
	"_id" : ObjectId("60e2a42cc76338ee56d30e4a"),
	"title" : "MongoDB 教程",
	"desc" : "MongoDB是一个nosql数据库",
	"by" : "andy",
	"url" : "https://www.mongodb.com",
	"tags" : [
		"mongodb",
		"nosql",
		"database"
	],
	"likes" : 9527
}
  • 为了方便演示,我又插入了几条数据,插入操作同上
    db.article.find().pretty()
    # {
      "_id" : ObjectId("60e2a42cc76338ee56d30e4a"),
      "title" : "MongoDB 教程",
      "desc" : "MongoDB是一个nosql数据库",
      "by" : "zhangsan",
      "url" : "https://www.mongodb.com",
      "tags" : [
          "mongodb",
          "nosql",
          "database"
      ],
      "likes" : NumberDecimal("102")
    }
    {
      "_id" : ObjectId("60e2badcc76338ee56d30e4b"),
      "title" : "MongoDB 测试",
      "desc" : "MongoDB是一个nosql数据库",
      "by" : "andy",
      "url" : "https://www.mongodb.com",
      "tags" : [
          "mongodb",
          "nosql",
          "database"
      ],
      "likes" : 9527
    }
    {
      "_id" : ObjectId("60e2bae8c76338ee56d30e4c"),
      "title" : "Python 测试",
      "desc" : "MongoDB是一个nosql数据库",
      "by" : "andy",
      "url" : "https://www.mongodb.com",
      "tags" : [
          "mongodb",
          "nosql",
          "database"
      ],
      "likes" : NumberDecimal("9526")
    }
    {
      "_id" : ObjectId("60e2a42cc76338ee56d30e4b"),
      "title" : "MongoDB 测试",
      "desc" : "MongoDB是一个nosql数据库",
      "by" : "tomtao626",
      "url" : "https://www.mongodb.com",
      "tags" : [
          "mongodb",
          "nosql",
          "database"
      ],
      "likes" : 500
    }
    {
      "_id" : ObjectId("60e2a42cc76338ee56d30e4f"),
      "title" : "MongoDB 测试",
      "desc" : "MongoDB是一个nosql数据库",
      "by" : "zhangsan",
      "url" : "https://www.mongodb.com",
      "tags" : [
          "mongodb",
          "nosql",
          "database"
      ],
      "likes" : 95
    }
    

  • MongoDB中的条件操作符,可以对比下关系型数据库的SQL语句
操作 格式 SQL中的类似语句
等于 {<key>:<value>} where title = 'MongoDB 教程'
小于 {<key>:{$lt:<value>}} where likes < 50
小于或等于 {<key>:{$lte:<value>}} where likes <= 50
大于 {<key>:{$gt:<value>}} where likes > 50
大于或等于 {<key>:{$gte:<value>}} where likes >= 50
不等于 {<key>:{$ne:<value>}} where likes != 50
  • 条件查询,查询titleMongoDB 教程的所有文档
> db.article.find({'title':'MongoDB 测试'})

  • 条件查询,查询likes大于500的所有文档
> db.article.find({'likes':{$gt:50}})

  • AND条件可以通过在find()方法传入多个键,以逗号隔开来实现,例如查询titleMongoDB 测试并且byzhangsan的所有文档;
> db.article.find({'title':'MongoDB 测试','by':'zhangsan'})

  • OR条件可以通过使用$or操作符实现,例如查询title为Python 测试或MongoDB 测试的所有文档;
db.article.find({$or:[{"title":"MongoDB 测试"},{"title": "Python 测试"}]})

  • AND 和 OR条件的联合使用,例如查询likes大于500,并且title为Python 测试或者”MongoDB 测试的所有文档。
> db.article.find({'likes':{$gt:500}, $or:[{'title':'Python 测试'},{'title':'MongoDB 测试'}]})

Limit与Skip操作

  • 读取指定数量的文档,可以使用limit()方法,语法如下
db.collection.find().limit(NUMBER)
  • 只查询article集合中的2条数据;
> db.article.find().limit(2)

  • 跳过指定数量的文档来读取,可以使用skip()方法,语法如下
db.collection.find().limit(NUMBER).skip(NUMBER)
  • 从第二条开始,查询article集合中的2条数据;
> db.article.find().limit(2).skip(1)

排序

  • 使用sort()方法对数据进行排序,sort()方法通过参数来指定排序的字段,并使用1和-1来指定排序方式,1为升序,-1为降序,语法如下
db.collection.find().sort({KEY:1})
  • 按article集合中文档的likes字段降序排列
> db.article.find().sort({likes:-1})

索引

  • 使用createIndex()方法来创建索引,语法如下
db.collection.createIndex(keys, options)
# background:建索引过程会阻塞其它数据库操作,设置为true表示后台创建,默认为false
# unique:设置为true表示创建唯一索引
# name:指定索引名称,如果没有指定会自动生成
  • 给title和desc字段创建索引,1表示升序索引,-1表示降序索引,指定以后台方式创建
> db.article.createIndex({"title":1, "desc":-1},{background:true})

  • 查看article集合中已经创建的索引
> db.article.getIndexes()

聚合

使用aggregate()方法,类似于SQL中的group by语句,语法如下;

> db.collection.aggregate(AGGREGATE_OPERATION)

聚合中常用操作符如下;

操作符 描述
$sum 计算总和
$avg 计算平均值
$min 计算最小值
$max 计算最大值
  • 根据likes数值分组,计算对应组所含文档的数量
> db.article.aggregate([{$group:{_id:"$likes", sum_count:{$sum:1}}}])
# { "_id" : 500, "sub_count" : 1 }
{ "_id" : 9527, "sub_count" : 2 }
{ "_id" : 95, "sub_count" : 2 }

  • 根据title分组,计算每组数据的likes平均值
> db.article.addredate([{$group:{_id:"$title", avg_likes:{$avg:"$likes"}}}])

正则

MongoDB使用$regex操作符来设置匹配字符串的正则表达式,可以用来模糊查询,类似于SQL中的like操作;

  • 例如查询title中包含教程的文档;
> db.article.find({title:{$regex:"教程"}})
  • 不区分大小写的模糊查询,使用$options操作符;
> db.article.find({title:{$regex:"elasticsearch",$options:"$i"}})