目录
- 基本概念
- 基本指令
- 数据库的CRUD操作
- 1. [向数据库中插入文档](https://docs.mongodb.com/manual/tutorial/insert-documents/)
- 2. [查询当前集合中的文档](https://docs.mongodb.com/manual/tutorial/query-documents/)
- 3. [修改集合中的文档](https://docs.mongodb.com/manual/tutorial/update-documents/)
- 4. [删除集合中的文档](https://docs.mongodb.com/manual/reference/delete-methods/#additional-deletes)
- 参考文献
基本概念
数据库(database)
集合(collection)
文档(document)
- 在MongoDB中,数据库和集合都不需要手动创建,当创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。
基本指令
show dbs
或show databases
:显示当前的所有数据库。use databaseName
:进入到指定的数据库中。db
:当前所处的数据库。show colloections
:显示数据库中的所有集合。
数据库的CRUD操作
1. 向数据库中插入文档
db.collectionName.insert(docObject)
db.collectionName.insert([docObject])
#或者更加明确的语义:
db.collectionName.insertOne(docObject)
db.collectionName.insertMany([docObject])
db
:数据库的名字。在命令行中,可以使用db
指令获取当前数据库的名字。collectionName
:集合的名字。insert
为集合的方法。docObject
:文档对象。JSON对象。[docObject0, ..., docObjectn]
:表示向集合插入多个文档对象。用[]
括起来,文档对象之间使用,
分隔。- 向集合插入文档对象时,如果没有指定
_id
属性,数据库自动为文档添加_id
属性,该属性用来作为文档的唯一标识符。可以通过ObjectId()
根据时间戳和机器码生成id属性或者自己自由指定,要确保唯一性。 - 向数据库中一次性插入多条数据:
#多次调用数据库方法会导致性能下降
for (var i = 1; i<=20000; i++){
db.collectionName.insert({num:i});
}
#一次性插入多条数据
var arr = [];
for (var i = 1; i<=20000; i++){
arr.push({num:i});
}
db.collectionName.insert(arr);
2. 查询当前集合中的文档
#查询当前集合中所有的文档
db.colloectionName.find()或db.colloectionName.find({})
#指定属性查询,返回一个满足条件的文档数组
db.colloectionName.find({ <field>:<value1>, ..., <fieldn>:<valuen>})
#指定属性查询,返回第一个满足条件的文档
db.colloectionName.findOne({<field>:<value1>})
- 集合的
find()
方法返回一个数组。使用[]
获取指定的索引的文档对象;使用.count()
或.length()
查看返回数组的长度。 - 查询条件
{<field>:<value>}
表示的是在field
属性的返回值中只要存在含有value
则匹配成功。例如当value
是数组的情况下:
{ "name":zhangsan, "hobbys":["books", "movies", "sports"]}
db.collectionName.find({"hobbys":"movies"}) #此时可以找到上述文档对象
- 当查询条件中的
value
是文档时,称之为内嵌文档,所有的内嵌文档的访问都是支持点号.
访问的,比如:
{"name":zhangsan, "hobbys":{movies:["thriller", "action", "opera"]}
db.collectionName.find({"hobbys.movies":"action"}) #此时可以找到上述文档对象
- 如果
value
是递归文档,可以支持一直使用点号访问下去;如果是文档数组,也可以点号访问。 - 使用查询操作符:
$eq # target == a; EXAMPLE: collectionName.find({num:{$eq:5});
$gt # target > a; EXAMPLE: collectionName.find({num:{$gt:5});
$gte # target >= a; EXAMPLE: collectionName.find({num:{$gte:5});
$in # target == a || target == b; EXAMPLE: collectionName.find({num:{$in:[5, 15]});
$lt # target < a; EXAMPLE: collectionName.find({num:{$lt:5});
$lte # target <=a; EXAMPLE: collectionName.find({num:{$lte:5});
$ne # target != a; EXAMPLE: collectionName.find({num:{$ne:5});
$nin # target != a && target != b; EXAMPLE: collectionName.find({num:{$nin:[5, 15]});
# NOTE:
# colloectionName.find({num:{$eq:5})和colloectionName.find({num:5})的区别:
# 当num的属性返回值返回值是数组时,如果数组中包含5,后者是能够返回的,$eq不行,$eq要求属性返回值和测试条件等价。
- 使用方法
.limit()
和.skip()
。.limit(k)
用于限制返回的文档数量(返回k条)。.skip(k)
用于跳过前k条数据。
collectionName.find().limit(20);
collectionName.find().skip(40).limit(20)或collectionName.find().limit(20).skip(40)
- 使用方法
.sort()
对查询的文档进行排序
#将查询结果按照field属性排序,参数k为int型,1表示升序排序,-1表示降序排序
db.collectionName.find({}).sort({<field>:k})
#将查询结果先按field0排序,如果相同的再按field1排序,'k==1'为升序,'k==-1'为降序
db.collectionName.find({}).sort({<field0>:k0, <field1>:k1})
- 为find传入第二个条件对象,对查询结果的显示进行过滤?
#对返回的文档数组投影
#当'k==1'的时候该属性及其对应的字段投影,当'k==0'时不投影;
#_id属性默认是投影的,如果要禁用设置'_id:0'以禁用;
db.collectionName.find({}, {field0:k0, field1:k1, field2:k2})
3. 修改集合中的文档
db.collectionName.update(<filter>, <update>, <options>)
#或者使用更加明确的语义
db.collectionName.updateOne(<filter>, <update>)
db.collectionName.updateMany(<filter>, <update>)
db.collectionName.replaceOne(<filter>, <update>)
-
<filter>
:表示过滤条件。用来判断修改哪个文档。 -
<update>
:表示更新后的文档。描述了怎么更新该文档。具有以下的形式:
#Update docment.
{
<update operator>: { <field1>: <value1>, ... },
<update operator>: { <field2>: <value2>, ... },
...
}
其中,<update operator>
为修改操作符,描述了不同的修改操作。可以在官方文档中查询。
<options>
:表示修改的配置选项。
4. 删除集合中的文档
db.collectionName.remove(docObject) #删除一个或多个文档,可以第二个参数传递一个true,则只会删除一个,如果传递一个空参数会删除所有。
或者
db.collectionName.deleteOne(docObject)
db.collectionName.deleteMany(docObject)
db.collectionName.drop() #删除集合,如果是最后一个集合,会同时删除数据库
db.dropDatabase() #删除数据库
删库跑路?