mongodb基础
每次进一个新的项目,从关系型数据库切换到非关系型数据库mongod
时,总是会忘记一些命令行。比如查看集合,过滤文档这些的命令,这篇文章就简单的记录下mongodb的命令行。
概念介绍
MongoDB
是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于JSON
对象。字段值可以包含其他文档,数组及文档数组。
{
"_id" : ObjectId("5b98c0201ac0b93a91877119"),
"operator" : "Wu Yang",
"status" : 10001,
"operateTime" : ISODate("2018-09-12T07:28:32.559Z"),
"__v" : 0,
}
Database
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。相当于mysql的数据库
Collection
集合就是MongoDB
文档组,集合存在于数据库中,集合没有固定的结构。相当于mysql的表
Document
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。相当于mysql的表中的一行记录
简单命令行
连接mongodb
MongoDB
的连接格式有以下两种,参考mongo连接:
SRV
: 主机名与 DNS SRV 记录对应的连接字符串。
mongodb+srv://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
Standard
: 指定运行 mongod 或 mongos 实例的所有主机的连接字符串
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
所以举例子来说:
// SRV
mongosh "mongodb+srv://username:password@localhost:27018/love_family"
// Standard
mongosh "mongodb://username:password@localhost:27018/love_family"
数据库
MongoDB
创建数据库的语法格式:use DATABASE_NAME
。如果数据库不存在,则创建数据库,否则切换到指定数据库。
MongoDB
删除数据库的语法格式:db.dropDatabase()
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
集合
在 MongoDB
中,你不需要创建集合。当你插入一些文档时,MongoDB
会自动创建集合。
- 集合的创建
db.createCollection(name)
db.collection.insert({})
- 集合的查询
// 返回每一个集合
show collections
show tables
// 返回到一个列表中
db.getCollectionNames()
- 集合名的修改
db.old.renameCollection(“new”)
- 集合的删除
db.collection.drop()
文档
- 文档的插入
创建或插入操作向集合添加新文档。如果集合当前不存在,则插入操作将创建集合。
db.collection.insertOne()
db.collection.insertMany()
db.collection.insert()
举个例子:
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
链接:https://docs.mongodb.com/manual/tutorial/insert-documents/
- 文档的查询
查询数据的语法如下
db.collection.find(query, projection)
比较查询运算符
$eq: Matches values that are equal to a specified value.
$gt: Matches values that are greater than a specified value.
$gte: Matches values that are greater than or equal to a specified value.
$in: Matches any of the values specified in an array.
$lt: Matches values that are less than a specified value.
$lte: Matches values that are less than or equal to a specified value.
$ne: Matches all values that are not equal to a specified value.
$nin: Matches none of the values specified in an array.
逻辑查询运算符
// AND
db.COLLECTION_NAME.find({ status: "A", qty: { $lt: 30 } })
// OR
db.COLLECTION_NAME.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
// AND 和 OR
db.COLLECTION_NAME.find( {
status: “A",
$or: [ { qty: { $lt: 30 } }, { item: ‘journal’} ]
} )
limit or skip
如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
db.COLLECTION_NAME.find().limit(NUMBER)
我们还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
sort运算符
在 MongoDB
中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
count or distinct
db.COLLECTION_NAME.count(query, options)
db.COLLECTION_NAME.distinct(field, query, options)
Query for Null or Missing Fields
举个下面的例子
db.inventory.insertMany([
{ _id: 1, item: null },
{ _id: 2 }
])
下面的具体使用
// Equality Filter:value is null or do not contain that value
db.inventory.find( { item: null } )
// Type Check:value is null
db.inventory.find( { item : { $type: 10} } )
// Existence Check: do not contain that value
db.inventory.find( { item : { $exists: false } } )
- 文档的更新
MongoDB提供了db.collection.update()方法来更新集合里面的文档:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
Tips
常用的update operator: $inc
, $rename
, $set
, $unset
。
- 文档的删除
MongoDB
提供以下方法来删除文档
db.collection.deleteMany()
db.collection.deleteOne()
下面是具体使用
// Delete All Documents:
db.inventory.deleteMany({})
// Delete All Documents that Match a Condition:
db.inventory.deleteMany({ status : "A" })
// Delete Only One Document that Matches a Condition:
db.inventory.deleteOne( { status: "D" } )
// Delete All Documents and index:
db.inventory.drop()
聚合操作
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。格式如下
db.collection.aggregate( [ { <stage> }, ... ] )
下面是常用的
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
链接:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
例子一:
db.user.aggregate([
{$match: {age: {$lt: 30}}},
{$sort: {age: 1}},
{$skip: 1},
{$limit: 3},
{$project: {name: 1, like: 1, age: 1, _id: 0}}
])
例子二:
db.vehicleinfos.aggregate([{
$group: {
_id: '$category',
count: { $sum: 1 }
}
}])
mongodb relationships
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。文档间可以通过嵌入和引用来建立联系
嵌入式关系
数据保存在单一的文档中,可以比较容易的获取和维护数据。这种数据结构的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。
引用式关系
引用式关系是设计数据库时经常用到的方法,这种方法把用户数据文档和用户地址数据文档分开,通过引用文档的 id 字段来建立关系。
链接:https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-one-relationships-between-documents/