Skip to main content

mongodb基础

huhxAbout 6 mindbDBMongodb

每次进一个新的项目,从关系型数据库切换到非关系型数据库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连接open in new window

  • 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/open in new window

  • 文档的查询

查询数据的语法如下

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 operatoropen in new window: $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/open in new window

例子一:

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/open in new window

FAQ

总结

参考