Monogodb详解

什么是monogodb?

MongoDB 是一种开源的、面向文档的 NoSQL 数据库管理系统。它采用了类似 JSON 的 BSON 格式来存储和表示数据,支持高度灵活的非结构化数据模型。它使用 Bson(Binary JSON)格式来存储数据,数据以文档的形式组织,每个文档可以具有不同的结构,没有固定的表结构,更加灵活。并且作为非关系型数据库之一它支持水平扩展,可以通过添加更多的节点来增加数据库的处理能力,实现高可用性和负载均衡。

在MongoDB中,数据存储的基本单位是文档,一个文档相当于关系型数据库中的一行记录。一个集合可以包含多个文档,相当于关系型数据库中的表格。每个文档由多个字段组成,每个字段都有一个名字和一个值。

MongoDB下载与安装

官网:https://www.mongodb.com/try/download/community

这里下载与安装不做重点讲述,详情可以参考这位博主

参考文章

入门

注意!mogodb中id默认为object类型

如图所示

一个:db.集合名.insertOne(文档)

多个:db.集合名.insertMany(文档)

一个或多个:db.集合名.insert(文档)

例子:

//增加name和age字段并插入一条文档,值得注意的是,跟mysql不同若不存在字段则会自动创建。
db.Cao.insert({ "name": "zhang","age":"25"});
//增加name为li,age为25的文档
db.Cao.insert({ name: "li",age:"25"});

修改

db.集合名.update(

​    <query>,

​    <update>,

​    {

​        upsert:<boolean>,

​        multi:<boolean>,

​        writeConcern:<documnet>

​    }

)

//query为update的查询条件

//update为操作的对象 

//upsert可选,若不存在用于指定更新操作时的行为。它是一个布尔值,表示如果更新操作没有找到匹配的文档,则是否插入一个新文档。如果upsert参数设置为true,则MongoDB将执行一个更新操作,如果没有找到匹配的文档,则插入一个新文档。如果upsert参数设置为false,则MongoDB将不会插入新文档,而是返回一个空的更新结果。

//multi可选,如果不指定,则默认为false,表示只更新第一个匹配的文档。如果设置为true,则MongoDB将更新所有匹配的文档。

//writeConcern可选,抛出异常的级别

例子:

db.collection.update(
   { name: "John" },
   { $set: { age: 30 } },
   { upsert: true, multi: true }
)

在这个示例中,我们更新所有名为"John"的文档,将它们的年龄设置为30。如果没有找到匹配的文档,则插入一个新文档。该操作将更新所有匹配的文档,而不仅仅是第一个匹配的文档。这个操作的确认级别使用默认的写入确认级别。

除了$set操作符之外,还有其他操作符可以用于update()函数。以下是一些常用的操作符:

  • $inc:用于将一个字段的值增加一个指定的数值。

  • $push:用于将一个值添加到一个数组中。

  • $pull:用于从一个数组中删除一个值。

  • $rename:用于重命名一个字段。

  • $unset:用于删除一个字段。

db.collection.update(
   { name: "John" },
   { $inc: { age: 1 } }
)

删除

使用remove()函数来删除一个或多个文档

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

//删除所有文档
db.collection.remove({})

若使用remove直接以id为判断删除

使用deleteOne()函数和deleteMany()函数

//删除名为"John"的第一个文档。
db.collection.deleteOne({ name: "John" })



//这个示例将删除年龄大于30的所有文档。
db.collection.deleteMany({ age: { $gt: 30 } })

查询集合中所有文档

(以名为mycollection的集合为例)db.collection('mycollection').find(query,projection)

条件查询

查询与条件相匹配的文档,常见条件有

  • $gt:大于(greater than)

  • $gte:大于等于(greater than or equal to)

  • $lt:小于(less than)

  • $lte:小于等于(less than or equal to)

  • $gte、$lt、$lte操作符查询指定范围内的文档

  • $exists操作符用于查询一个字段是否存在于文档中

  • $all操作符用于查询包含所有指定值的文档。

  • $in 匹配一个字段的值是否在指定的集合文档中

  • $and,$or.....

举例

db.collection('mycollection').find({name: 'John'})
db.collection('mycollection').find({age: {$gte: 18}})
db.collection('mycollection').find({gender: {$in: ['male', 'unknown']}})
排序查询
db.collection('mycollection').find().sort({age: 1})
//age表示要查询的字段,1表示升序,-1表示降序

db.collection('mycollection').find().sort({age:1,id:-1})
//年龄相同时,按照id倒序
分页查询
db.collection('mycollection').find().skip(10).limit(5)
//skip表示要跳过文档数量,limit表示返回的文档数量
模糊查询
db.Cao.find(
    {
        name:{$regex:/wan/}
    }
)

db.Cao.find(
    {
        name:{$regex:".*wan.*"}
    }
)

上述两个模糊查询查询效果相同,均表示查询含有"wan"字段的数据,但是第一个是正则表达式的对象,而第二个则为正则表达式。

进阶

新增数组列

//在Cao集合中新增hobby列
db.Cao.updateMany({},{$set:{hobby:[]}})

//给名字为wang的hobby字段添加java
db.Cao.updateMany({name:"wang"}, {$push:{hobby:"java"}})

//给li添加java,python,c++,这里这种方法将会把这三个元素作为一个·数组添加进去
db.Cao.updateMany({name:"li"}, {$push:{hobby:"java","python","c++"}})

//添加each字段则分开插入每个元素
db.Cao.updateMany({name:"li"}, {$push:{hobby:{$each:["麻将","抽烟","喝酒"]}}})

删除

//删除集合Cao中name为li的hobby数组中第一个元素
//值为1则删除第一个,-1删除最后一个
db.Cao.updateMany({name:"li"},{$pop:{hobby:1}})

//删除集合Cao中name为li的hobby数组中值为抽烟的元素
db.Cao.updateMany({name:"li"},{$pull:{hobby:"抽烟"}})

修改

//将值为蹦极的文档修改为健身
db.Cao.updateMany({name:"li",hobby:"蹦极"},{$set:{"hobby.$":"健身"}})

查询

`$in`

用于匹配数组中的任何一个元素,语法如下

db.collection.find({ field: { $in: [value1, value2, ...] } });

`$all`

用于匹配包含数组中所有元素的文档,语法如下

db.collection.find({ field: { $all: [value1, value2, ...] } });

`$size`

用于匹配具有指定数组大小的文档,语法如下

db.collection.find({ field: { $size: sizeValue } });

`$elemMatch`

用于查询嵌套数组中的元素,语法如下

db.collection.find({ field: { $elemMatch: { subfield: value } } });

`$not`

用于查询不匹配指定数组条件的文档,语法如下

db.collection.find({ field: { $not: { operator: value } } });

聚合

同样的monogodb中也有聚合函数,下面给出一些常见的聚合函数及示例

使用$match筛选年龄大于等于18的用户:

javascriptCopy Codedb.users.aggregate([
  { $match: { age: { $gte: 18 } } }
]);

使用$group按照性别进行分组,并计算每个性别的用户数量:

javascriptCopy Codedb.users.aggregate([
  { $group: { _id: "$gender", count: { $sum: 1 } } }
]);

使用$project选择返回的字段,并新增一个计算字段:

javascriptCopy Codedb.orders.aggregate([
  {
    $project: {
      _id: 0,
      order_id: "$_id",
      total: { $multiply: ["$price", "$quantity"] }
    }
  }
]);

使用$limit限制查询结果的数量:

javascriptCopy Codedb.users.aggregate([
  { $limit: 10 }
]);

使用$skip跳过前10条文档:

javascriptCopy Codedb.users.aggregate([
  { $skip: 10 }
]);

使用$sort对价格字段进行升序排序:

javascriptCopy Codedb.products.aggregate([
  { $sort: { price: 1 } }
]);

相关推荐

  1. MongoDB日期查询详解

    2024-01-10 15:06:02       35 阅读
  2. MongoDB详解(1)

    2024-01-10 15:06:02       32 阅读
  3. Mongodb $text详解

    2024-01-10 15:06:02       26 阅读
  4. MongoDB ObjectId 详解

    2024-01-10 15:06:02       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-10 15:06:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-10 15:06:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-10 15:06:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-10 15:06:02       20 阅读

热门阅读

  1. python爬虫实战(6)--获取某度热榜

    2024-01-10 15:06:02       36 阅读
  2. Linq练习

    2024-01-10 15:06:02       42 阅读
  3. Android 无限循环RecyclerView的完美实现方案

    2024-01-10 15:06:02       30 阅读
  4. Flink之Task重启策略

    2024-01-10 15:06:02       35 阅读
  5. 如何使用PHP开发缓存优化图片加载速度

    2024-01-10 15:06:02       30 阅读
  6. 广度优先搜索

    2024-01-10 15:06:02       33 阅读
  7. 理解DOM树的加载过程

    2024-01-10 15:06:02       35 阅读
  8. Centos 7 安装Node.js服务

    2024-01-10 15:06:02       41 阅读
  9. 机器人控制箱内部包含什么零件,有什么作用。

    2024-01-10 15:06:02       39 阅读
  10. 【Verilog】期末复习——设计11011序列检测器电路

    2024-01-10 15:06:02       37 阅读