#MongoDB的基本使用:
在bin目录下,执行mongo脚本,可以开启mongo的shell命令行。
`./mongo`
MongoDB shell version: 3.0.6
connecting to: test
Server has startup warnings:
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten]
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten]
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten]
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-04-24T04:43:56.723-0700 I CONTROL [initandlisten]
>
数据库:
创建数据库:`use studydb`
> use studydb
switched to db studydb
如果数据库不存在,mongodb会自动创建数据库。
查询当前数据库:`db`
~~~
> db
studydb
~~~
查询所有数据库:`show dbs`
上面并没有我们的数据库,要想显示它,需要先往里面填加数据。mongodb中,集合只有在插入数据后才会真正被创建。也就是说创建集合后再插入一个文档,集合才会被创建。
新增数据:`db.bookcoll.insert({"name":"mongodb","content":"hello world!"})`
> db.bookcoll.insert({"name":"mongodb","content":"hello world!"})
WriteResult({ "nInserted" : 1 })
db表示当前数据库,bookcoll表示集合, 如果没有会自动创建。
> show dbs
local 0.078GB
study 0.078GB
创建集合:`db.createCollection(name,options)`
**name: 集合名称(必填)
options: 可配置参数(选填)**
options取值:
capped: 布尔型。如果为true,则创建固定集合。固定集合是有固定大小的集合,当达到最大大小时,它会自动覆盖最早的文档。当为true时,必须指定size参数。
autoIndexId: 布尔型。如果为true,自动在_id字段创建索引。默认为false。
size: 数值型。为固定集合指定一个最大值,以千字节(KB)记。
max: 数值型。指定固定集合中包含文档的最大数量。
mongodb在插入文档时,先检查固定集合的size字段,在检查max字段。
> db.createCollection("java")
{ "ok" : 1 }
查看所有集合:`show collections`或`show tables`
> show collections
bookcoll
java
system.indexes
> show tables
bookcoll
java
system.indexes
>
创建固定集合:`db.createCollection("books", {capped:true, autoIndexId:true, size:1000, max:5})`
> db.createCollection("book",{capped:true, autoIndexId:true, size:1000, max:5})
{ "ok" : 1 }
插入文档:`db.book.insert()`或`db.book.save()`
可以通过insert或save方法向集合中插入文档。db当前数据库,book:要插入数据的集合名。还可以通过定义变量的方式插入。
之前创建了一个固定集合。设置的最大值是5,现在插入五条数据测试。
> db.book.insert({"name":"java"})
WriteResult({ "nInserted" : 1 })
> db.book.save({"price":100.00})
WriteResult({ "nInserted" : 1 })
> db.book.save({"age":10})
WriteResult({ "nInserted" : 1 })
> document={"phone":"10086"}
{ "phone" : "10086" }
> db.book.insert(document)
WriteResult({ "nInserted" : 1 })
> db.book.insert({"content":"hello world"})
WriteResult({ "nInserted" : 1 })
查看插入的数据:`db.book.find()`
{ "_id" : ObjectId("5ea2e439383590406bd4e0f7"), "name" : "java" }
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : 100 }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : 10 }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
_id字段为mongodb自动为文档生成的主键。在mongodb中,每一个database就相当于关系型数据库中的database。
collection就相当于关系型数据库中的表table。而每一条文档就是行row,文档中的字段就是列column。在mongodb中,并不要求每一行的每一列都相同。
无论是列名还是列的数据格式,都可以不同。
上面插入的是一个固定集合,我们设置的最大数是五个,现在已经五个了,我们再插入一条记录。
> db.book.insert({"price":"50"})
WriteResult({ "nInserted" : 1 })
> db.book.find()
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : 100 }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : 10 }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
{ "_id" : ObjectId("5ea2e725383590406bd4e0fc"), "price" : "50" }
可以看到, 超过最大数量时,会自动覆盖掉最早的数据,而且即使字段名一样时,字段的值也可以不相同。再mongodb中,每一条文档就是单独的行,与其他的行的字段类型等没有关连。
更新文档: `db.book.update()`或`db.book.save()`
mongodb中通过update()方法或save()方法来更新。
**update方法:** `db.book.update(<query>,<update>,{upsert: <boolean>, multi: <boolean>, writeConcern: <document>})`
方法参数介绍:
query: 类似sql语句中的where后的条件
update: 更新的对象,类似与sql update语句中set后的属性
upsert: 当更新的对象找不到时,是否插入数据,默认false。
multi:mongodb默认只更新找到的第一条记录,如果改为true,则更改
writeConcern: 抛出异常级别
> db.book.find()
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : 100 }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : 10 }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
{ "_id" : ObjectId("5ea2e725383590406bd4e0fc"), "price" : "50" }
> db.book.update({"price":"50"},{$set:{"price":"30"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.book.find()
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : 100 }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : 10 }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
{ "_id" : ObjectId("5ea2e725383590406bd4e0fc"), "price" : "30" }
>
加上可选参数:
> db.book.update({"price":100},{$set:{"price":"30"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.book.find()
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : "30" }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : 10 }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
{ "_id" : ObjectId("5ea2e725383590406bd4e0fc"), "price" : "30" }
> db.book.update({"price":"30"},{$set:{"price":"50"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.book.find()
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : "50" }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : 10 }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
{ "_id" : ObjectId("5ea2e725383590406bd4e0fc"), "price" : "50" }
修改时, {$set:{}},修改的内容的key必须是当前记录内已经有的key,如果没有就会修改失败,不能修改已有的子段。就像再mysql中update命令一样。
update table set a=?,b=? where c=?
条件字段必须存在, set的字段也必须是已有字段,不能是不存在的字段。
**save方法:通过传入的文档来替换已有的文档** `db.book.save(<documemt>,{writeConcern:<document>})`
> db.book.save({ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age":"50" })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.book.find().pretty()
{ "_id" : ObjectId("5ea2e454383590406bd4e0f8"), "price" : "50" }
{ "_id" : ObjectId("5ea2e483383590406bd4e0f9"), "age" : "50" }
{ "_id" : ObjectId("5ea2e4f0383590406bd4e0fa"), "phone" : "10086" }
{ "_id" : ObjectId("5ea2e554383590406bd4e0fb"), "content" : "hello world" }
{ "_id" : ObjectId("5ea2e725383590406bd4e0fc"), "price" : "50" }
我们通过修改了{ "_id" : ObjectId("5ea2e483383590406bd4e0f9")}的整个文档,同样,修改时只能修改已有字段,不能新增字段。
查询文档:`db.book.find(query,projection)`
query: 可选搜索条件
projection: 使用投影操作符返回指定的键值。
首先插入一条数据:
> show collections
book
bookcoll
java
system.indexes
> db.bookcoll.find()
{ "_id" : ObjectId("5ea2d99b383590406bd4e0f6"), "name" : "mongodb", "content" : "hello world!" }
> db.bookcoll.insert({"name":"java","size":"30","content":"hello world","price":"100"})
WriteResult({ "nInserted" : 1 })
> db.bookcoll.find({"name":"java"},{"name":1,"price":1,"content":1})
{ "_id" : ObjectId("5ea433ede672477b2e10d90d"), "name" : "java", "content" : "hello world", "price" : "100" }
projection 指定要返回的键。用法:
db.collection.find(query,{key1:1,key2:1})
当值为1时返回,指定的键,返回key为1的键,不返回其他键,当key为0时,返回其他键,不返回指定键。
要么都为1,要么都为0,不能混用。
正例:db.collection.find(query,{key1:1,key2:1})或db.collection.find(query,{key1:0,key2:0})
反例:db.collection.find(query,{key1:1,key2:0})
此外,查询条件query还支持or语句and语句大于小于等等。
db.collection.find({$or:[{"content":"hello world!"},{"name":"java"}]})
> db.bookcoll.find()
{ "_id" : ObjectId("5ea2d99b383590406bd4e0f6"), "name" : "mongodb", "content" : "hello world!" }
{ "_id" : ObjectId("5ea433ede672477b2e10d90d"), "name" : "java", "size" : "30", "content" : "hello world", "price" : "100" }
> db.bookcoll.find({$or:[{"content":"hello world!"},{"name":"java"}]})
{ "_id" : ObjectId("5ea2d99b383590406bd4e0f6"), "name" : "mongodb", "content" : "hello world!" }
{ "_id" : ObjectId("5ea433ede672477b2e10d90d"), "name" : "java", "size" : "30", "content" : "hello world", "price" : "100" }
该语句等价与sql:select * from bookcoll where name = 'java' or content = 'hello world!'
删除一个文档:`db.collection.remove(query,justOne)`
query: 搜索条件
justOne: 可选参数,如果设为true,或1,则只删除找到的第一条文档,默认为false,删除所有匹配条件的文档。
**注意:固定集合不能删除记录,但可以删除整个集合重建**
> db.bookcoll.find()
{ "_id" : ObjectId("5ea2d99b383590406bd4e0f6"), "name" : "mongodb", "content" : "hello world!" }
{ "_id" : ObjectId("5ea433ede672477b2e10d90d"), "name" : "java", "size" : "30", "content" : "hello world", "price" : "100" }
> db.bookcoll.remove({"name":"mongodb"})
WriteResult({ "nRemoved" : 1 })
> db.bookcoll.find()
{ "_id" : ObjectId("5ea433ede672477b2e10d90d"), "name" : "java", "size" : "30", "content" : "hello world", "price" : "100" }
> db.bookcoll.insert({"name":"mongodb","price":"100","content":"hello mongodb"})
WriteResult({ "nInserted" : 1 })
> db.bookcoll.insert({"name":"python","price":"100","content":"hello python"})
WriteResult({ "nInserted" : 1 })
> db.bookcoll.find()
{ "_id" : ObjectId("5ea433ede672477b2e10d90d"), "name" : "java", "size" : "30", "content" : "hello world", "price" : "100" }
{ "_id" : ObjectId("5ea43a99e672477b2e10d90e"), "name" : "mongodb", "price" : "100", "content" : "hello mongodb" }
{ "_id" : ObjectId("5ea43ab1e672477b2e10d90f"), "name" : "python", "price" : "100", "content" : "hello python" }
删除一条
> db.bookcoll.remove({"price":"100"},true)
WriteResult({ "nRemoved" : 1 })
> db.bookcoll.find()
{ "_id" : ObjectId("5ea43a99e672477b2e10d90e"), "name" : "mongodb", "price" : "100", "content" : "hello mongodb" }
{ "_id" : ObjectId("5ea43ab1e672477b2e10d90f"), "name" : "python", "price" : "100", "content" : "hello python" }
满足条件全部删除
> db.bookcoll.remove({"price":"100"})
WriteResult({ "nRemoved" : 2 })
> db.bookcoll.find()
>
> db.bookcoll.insert({"name":"mongodb","price":"100","content":"hello mongodb"})
WriteResult({ "nInserted" : 1 })
> db.bookcoll.insert({"name":"python","price":"100","content":"hello python"})
WriteResult({ "nInserted" : 1 })
> db.bookcoll.insert({"name":"java","price":"100","content":"hello java"})
WriteResult({ "nInserted" : 1 })
删除集合所有数据
> db.bookcoll.remove({})
WriteResult({ "nRemoved" : 3 })
删除集合:`db.collection.drop()`
> show collections
book
bookcoll
java
system.indexes
> db.book.drop()
true
> show collections
bookcoll
java
system.indexes
删除数据库:`db.dropDatabase()`
> show dbs
local 0.078GB
study 0.078GB
> use study
switched to db study
> db.dropDatabase()
{ "dropped" : "study", "ok" : 1 }
> show dbs
local 0.078GB