MongoDB文档查询操作

文档操作

1.文档插入

①单文档插入

db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.save(document)

insert()和save()方法的区别在于使用insert()方法插入文档时,集合中已存在该文档,则会报错;使用save()方法时,则会覆盖。

②多文档插入

db.COLLECTION_NAME.insertMany([document1,document2,···])

2.文档更新

语法:

db.COLLECTION_NAME.update(criteria,objNew,upsert,multi)

update():更新文档的方法

criteria:更新的查询条件,类似于sql中的where

objNew:新的对象和操作符,类似于sql中的set

upsert:不存在更新对象时,是否插入,默认为false

multi:默认为false,只更新查找到的第一个文档,反之更新所有

3.文档删除

①删除单个

db.COLLECTION_NAME.remove(
   ,
   {
     justOne:,
     writeConcern:
    }
)

②删除全部文档

db.COLLECTION_NAME.remove({})

4.文档简单查询

①查询所有文档语法

db.COLLECTION_NAME.find()

②查询所有文档,以易读的方式展示

db.COLLECTION_NAME.find().pretty()

5.按条件查询文档

基础语法:db.集合名.find(条件[,查询的列])

6.升级语法

db.集合名.find({键:值}) 注:值不直接写
{运算符:值}
db.集合名.find({
键:{运算符:值}
})

聚合操作

聚合管道操作是将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理。聚合管道是使用不同的管道阶段操作器进行不同聚合操作,管道阶段操作器也可称为管道操作符,常见管道操作符如下表:

MongoDB文档查询操作_第1张图片

语法

db.集合名称.aggregate([
{管道:{表达式}}
····
])

其中'[]'不是必须的,可以省略!!

索引

索引是一种特殊的数据结构,即采用B-Tree数据结构。索引是以易于遍历读取的形式存储着集合中文档的一小部分,文档的一小部分指文档中的特定字段或一/多组字段,并且这些字段均按照字段的值进行排序。索引项的排序支持有效的等值匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序的结果。

单字段索引

MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,因此被称为单字段索引(Single Field Index)。默认情况下,MongoDB中所有集合在“_id”字段上都有一个索引,用户也可以根据自己的需求添加额外索引来支持重要的查询和操作。由于MongoDB可以从任何方向遍历索引,因此对于单个字段索引和排序操作来说,索引项的排序顺序(即升序或降序)并不重要。

复合索引

MongoDB除了支持单字段索引外,还支持复合索引。所谓复合索引,就是包含多个字段的索引,一个复合索引最多可以包含31个字段。需要注意的是,若某字段属于哈希索引,则这时复合索引就不能包括该字段。

多键索引

若文档中的字段为数组类型,则每个字段都是数组中的一个元素,MongoDB将会为数组中的每个元素创建索引,因此被称为多键索引(Multikey Index)。多键索引允许通过匹配数组的一个或多个元素来查询包含该数组的文档。如果索引字段包含数组值,则MongoDB会自动确定是否创建多键索引,而无需显式地指定创建多键索引。

1.查看索引大小

语法

db.COLLECTION_NAME.totalIndexSize()

2.创建索引

语法

db.COLLECTION_NAME.createIndex(keys,options)

keys:指定索引键及排序顺序,该参数值为文档类型,key用于指定索引键,value指定排序顺序,1为升序,-1为降序

options:用于控制创建索引的选项,常见选项有unique和name,其中unique描述建立的索引是否唯一,默认为false。name描述所创建索引的名称,默认情况下MongoDB会通过连接索引的字段名和排序顺序生成一个索引名称。

3.删除索引

①删除所有索引

db.COLLECTION_NAME.dropIndexes()

②删除单个索引

db.COLLECTION_NAME.dropIndex(index)

实验目的:

  1.  掌握MongoDB 文档复杂查询

  2. 掌握MongoDB文档聚合查询

实验题目:

题目一:文档查询

1.1  使用test数据库,并新建items集合

首先,我们需要创建一个MongoDB数据库test,并在其中创建一个items集合,并插入给定的商品信息。以下是具体的MongoDB命令操作:

1.连接到MongoDB服务器:

如果你已经安装了MongoDB并在本地运行,你可以直接打开一个新的命令行窗口并输入mongo来连接到MongoDB服务器。

 2.切换到test数据库:

use test

3.创建items集合:

由于我们是在一个空的数据库中创建集合,因此不需要显式创建集合,当我们第一次向集合中插入文档时,集合会自动被创建。

1.2 插入文档数据:每个文档对应订单中某个商品相关信息,包括:

quantity:商品数量【商品卖出数量 】

price:商品单价

pnumber:商品编号【也是商品类型】

插入如下商品信息:

{"quantity":2,price:5.0,pnumber:"p003"},

{quantity:2,price:8.0,pnumber:"p002"},

{quantity:1,price:4.0,pnumber:"p002"},

{quantity:2,price:4.0,pnumber:"p001"},

{"quantity":4,price:10.0,pnumber:"p003"},

{quantity:10,price:20.0,pnumber:"p001"},

{quantity:10,price:20.0,pnumber:"p003"},

{quantity:5,price:10.0,pnumber:"p002"}

4.插入商品信息:

db.items.insertMany([
  {"quantity":2, "price":5.0, "pnumber":"p003"},
  {"quantity":2, "price":8.0, "pnumber":"p002"},
  {"quantity":1, "price":4.0, "pnumber":"p002"},
  {"quantity":2, "price":4.0, "pnumber":"p001"},
  {"quantity":4, "price":10.0, "pnumber":"p003"},
  {"quantity":10, "price":20.0, "pnumber":"p001"},
  {"quantity":10, "price":20.0, "pnumber":"p003"},
  {"quantity":5, "price":10.0, "pnumber":"p002"}
])

1.3     查询插入结果

5.查询插入结果:

db.items.find()

这将返回items集合中的所有文档。

1.4     查询价格大于5的商品数据

6.查询价格大于5的商品数据:

db.items.find({ price: { $gt: 5 } })

这里使用了$gt操作符,它代表“大于”。

1.5     查询quantity为10且价格大于等于5的商品数据

7.查询quantity为10且价格大于等于5的商品数据:

db.items.find({ quantity: 10, price: { $gte: 5 } })

这里使用了$gte操作符,它代表“大于或等于”。

题目二:聚合查询

聚合查询是MongoDB提供的一种强大的数据分析功能,它可以对数据进行各种转换和聚合操作。以下是我们将要执行的聚合查询:

2.1   使用聚合aggregate:统计订单中所有商品的数据,即统计quantity的总和

  1. 统计所有商品的数据:

    db.items.aggregate([
      { $group: { _id: null, totalQuantity: { $sum: "$quantity" } } }
    ])

    这里使用了$group阶段来分组文档,并使用$sum操作符来计算quantity字段的总和。_id: null表示所有文档都被分到同一组中。

2.2   使用聚合aggregate:通过产品类型来进行分组,然后在统计卖出的数量

2.通过产品类型来进行分组,然后在统计卖出的数量:

db.items.aggregate([
  { $group: { _id: "$pnumber", totalQuantity: { $sum: "$quantity" } } }
])

这里我们使用$group阶段来分组文档,根据pnumber字段来分组,并计算每个组的quantity总和。

2.3   使用聚合aggregate:通过相同的产品类型来进行分组,然后查询相同产品类型卖出最多的订单详情。

3.通过相同的产品类型来进行分组,然后查询相同产品类型卖出最多的订单详情:

db.items.aggregate([
  { $group: { _id: "$pnumber", totalQuantity: { $sum: "$quantity" } } },
  { $sort: { totalQuantity: -1 } },
  { $limit: 1 }
])

在这个聚合管道中,我们首先按pnumber分组并计算总数掶,然后按总数掶降序排序,最后通过$limit阶段限制结果集为1,以获取卖出数掶最多的商品类型。

2.4 使用聚合aggregate:通过相同的产品类型来进行分组,统计各个产品数量,然后获取最大的数量。

4.通过相同的产品类型来进行分组,统计各个产品数量,然后获取最大的数量:

db.items.aggregate([
  { $group: { _id: "$pnumber", totalQuantity: { $sum: "$quantity" } } },
  { $sort: { totalQuantity: -1 } },
  { $limit: 1 }
])

与上一个查询类似,我们首先按pnumber分组并计算总数掶,然后按总数掶降序排序,最后通过$limit阶段限制结果集为1,以获取卖出数掶最多的商品类型。

以上就是两个实验的所有步骤和查询。

你可能感兴趣的:(mongodb,数据库)