一 MongoDB简介
MongoDB是一个文档型数据库,数据以类似JSON的文档形式存储。
MongoDB的设计理念是为了应对大数据量、高性能和灵活性需求。
MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以BSON格式存储。
MongoDB将数据存储为一个文档,数据结构由键值对组成,文档类似于JSON对象,字段值可以包含其他文档,数组及文档数组。
mysql与MongoDB对比
二 MongoDB操作
1 登录和退出
登录客户端:mongo
退出:exit
2 数据库操作
(1)查看所有数据库
# 方法一 show databases # 方法二 show dbs
(2)选择数据库
1、选择数据库
use 数据库名
如果数据库不存在,则创建数据库,否则切换到指定数据库。
2、显示当前使用的数据库
db
(3)删除数据库
先选择数据库,再删除
db.dropDatabase()
3 集合操作
(1)创建集合
db.createCollection(集合名)
(2)查看所有集合
查看当前数据库的所有集合
show collections
(3)删除集合
db.集合名.drop()
4 文档操作
(1)新增文档
# 插入一条 db.集合名.insert({key:value}) # 插入多条 db.集合名.insert([{key1:value1}, {key2:value2}]) # 插入一条 db.集合名.insertOne({key:value}) # 插入多条 要是只插入一条会报错 db.集合名.insertMany()
例:
> db.myCollection.insert({name:"zhangsan",age:11}) WriteResult({ "nInserted" : 1 }) > db.myCollection.insert([{name:"wangwu",age:22},{name:"zhaoliu",age:22}]) BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] }) > db.myCollection.insertOne({name:"z"}) { "acknowledged" : true, "insertedId" : ObjectId("6645e331a0ca0d60dfb09af7") } > db.myCollection.find({}) { "_id" : ObjectId("6645b896a0ca0d60dfb09af2"), "name" : "zhangsan", "age" : 11 } { "_id" : ObjectId("6645dd92a0ca0d60dfb09af3"), "name" : "lisi", "age" : 12 } { "_id" : ObjectId("6645e11fa0ca0d60dfb09af4"), "name" : "wangwu", "age" : 13 } { "_id" : ObjectId("6645e14da0ca0d60dfb09af5"), "name" : "wangwu", "age" : 22 } { "_id" : ObjectId("6645e14da0ca0d60dfb09af6"), "name" : "zhaoliu", "age" : 22 } { "_id" : ObjectId("6645e331a0ca0d60dfb09af7"), "name" : "z" } { "_id" : ObjectId("6645e3b0a0ca0d60dfb09af8"), "name" : "a", "age" : 1 } { "_id" : ObjectId("6645e3b0a0ca0d60dfb09af9"), "name" : "b" } > db.myCollection.insertMany({name:"b"}) uncaught exception: TypeError: documents.map is not a function : DBCollection.prototype.insertMany@src/mongo/shell/crud_api.js:307:17 @(shell):1:1
例:
# 查询a是10的文档 {a:10} # 查询a是10,b是hello的文档 {a:10, b:"hello"} # 查询a>10 {a : {$gt : 10}} # 查询a为10或hello {a: {$in : [10, "hello"]}} # a是一个数组,同时包含[10, "hello"] {a : {$all : [10, "hello"]}} # a是一个数组,包含元素{b:1, c:2} {a : {$elemMatch : {b:1, c:2}}} # a以m开头 {a : /^m/} {a : {$regex : "^m"}} # a%10 = 1 {a : {$mod : [10,1]}}
(2)查询文档
# 查询所有 db.集合名.find() # 按条件查询 db.集合名.find({key:value}) # 按条件查询第一个 db.集合名.findOne({key:value}) # 按条件查询第一个,方式二 db.集合名.find({key:value})[0] # 查询所有结果的数量 db.stus.find({}).length() # 方式二 db.stus.find({}).count()
例:
> db.myCollection.find() { "_id" : ObjectId("6645b896a0ca0d60dfb09af2"), "name" : "zhangsan", "age" : 11 } { "_id" : ObjectId("6645dd92a0ca0d60dfb09af3"), "name" : "lisi", "age" : 12 } > db.myCollection.find({}) { "_id" : ObjectId("6645b896a0ca0d60dfb09af2"), "name" : "zhangsan", "age" : 11 } { "_id" : ObjectId("6645dd92a0ca0d60dfb09af3"), "name" : "lisi", "age" : 12 } > db.myCollection.find({name:"lisi"}) { "_id" : ObjectId("6645dd92a0ca0d60dfb09af3"), "name" : "lisi", "age" : 12 } > db.myCollection.findOne({name:"lisi"}) { "_id" : ObjectId("6645dd92a0ca0d60dfb09af3"), "name" : "lisi", "age" : 12 } > db.myCollection.find({name:"lisi"})[0] { "_id" : ObjectId("6645dd92a0ca0d60dfb09af3"), "name" : "lisi", "age" : 12 } > db.myCollection.find({}).length() 2
(3)更新文档
# 更新一个 db.collection.update() # 同时修改多个符合条件的文档 db.collection.updateMany() # 修改一个符合条件的文档 db.collection.updateOne() # 替换一个符合条件的文档 db.collection.replaceOne()
首先需要注意的是,在使用update()时,需要一个新的玩意加入,叫做修改操作符,一般长成:
$set 表示需要设置指定的属性 $unset 表示需要删除指定的属性 $push 表示给数组添加一个新元素,因为文档内也会有数组,数组便会有数组元素 $addToset 表示给数组添加一个新元素,和push的区别是,如果出现同名的数组元素,则不会再添加 $gt 大于 $gte 大于等于 $lt 小于 $lte 小于等于 $or [{条件一,条件二}] 表示或的意思,符合条件一或者条件二 $inc 表示自增,用在在原来数据的基础上对数据加减,可用于加薪减薪的操作
(4)删除文档
# 删除所有 db.集合名.remove() # 按条件删除 所有 db.集合名.remove({key:value}) # 按条件删除 一条 db.集合名.remove({key:value}, true) # 删除一条 db.collection.deleteOne() # 删除多条 db.collection.deleteMany() # 删除集合(如果最后一个集合没了,数据库也没了。。。) db.collection.drop()
例:
> db.myCollection.remove({name:"wangwu"}) WriteResult({ "nRemoved" : 2 })
三 实例
SQL与MongoDB语句对比
-- 创建表 CREATE TABLE users (name VARCHAR(128), age NUMBER) db.createCollection("users") -- 插入 INSERT INTO users VALUES('BOb', 32) db.users.insert({name:"Bob", age:32}) -- 查询所有字段 SELECT * FROM users db.users.find() -- 查询需要的字段 SELECT name, age FROM users db.users.find({}, {name:1, age:1, _id:0}) -- 查询age=33的用户 SELECT name, age FROM users WHERE age=33 db.users.find({age:33}, {name:1, age:1, _id:0}) -- 查询age>33的用户 SELECT * FROM users WHERE age>33 db.users.find({age, {$gt: 33}}) -- 查询age<=33的用户 SELECT * FROM users WHERE age<=33 db.users.find({age : {$gt:33}}) -- 查询age>33且age<40的用户 SELECT * FROM users WHERE age>33 AND age<40 db.users.find({age:{$gt:33, $lt<40}}) -- 查询age=32且name='Bob'的用户 SELECT * FROM users WHERE age=32 AND name='Bob' db.users.find({age:32, name:"Bob"}) -- 查询age=33 or name='Bob'的用户 SELECT * FROM users WHERE age=32 OR name='Bob' db.users.find({$or;[{age:33}, {name:"Bob"}]}) -- 查询age=33的用户,且正序 SELECT * FROM users WHERE age=33 ORDER BY name ASC db.users.find({age:33}).sort({name:1}) -- 倒序 SELECT * FROM users ORDER BY name DESC db.users.find().sort({name:-1}) -- 模糊查询 SELECT * FROM users WHERE name LIKE '%Joe%' dn.users.find({name: /Joe/}) -- 以什么开头 SELECT * FROM users WHERE name LIKE 'Joe%' db.users.find({name: /^Joe/}) -- limit SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().skip(20).limit(10) -- LIMIT 1 SELECT * FROM users LIMIT 1 db.users.findOne() -- 去重 SELECT DISTINCT name FROM users db.users.distinct("name") -- count SELECT COUNT(*) FROM users db.users.count() -- SELECT COUNT(*) FROM users WHERE age>30 db.users.find({age:{$gt:30}}).count()
参考
https://blog.csdn.net/lyyrhf/article/details/115469161
https://blog.csdn.net/weixin_45715650/article/details/120155319