【软件测试】MongoDB使用

MongoDB

将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
基本概念

  • 库: 存储数据的仓库
  • 集合: 若干文档组成集合
  • 文档: 一个文档代表一条数据

语句使用

注:区分大小写

// 查看所有“数据库”,没有数据的库看不到(MongoDB并没有真正创建这个库)
show databases;
show dbs;

// 切换数据库(没有则创建)
use mydb1;
// 查看当前连接的数据库
db;

//删库
db.dorpDatabase('mydb1');

集合

use mydb1;
// 查看数据库下的所有集合
show collections;
// 建集合
db.createCollection('product')
// 删集合
db.集合名.drop();

文档

注:向一个不存在的集合插入数据,则会自动创建这个集合
语法: db.集合名.insert(文档)

use mydb1;
db.product.insert({name:'龙的传人',item:'电影票',sotcks:52,price:25});
db.product.insert({name:'金刚',item:'电影票',stocks:99,price:30,
dates:['2022-9-1','2022-9-2','2022-9-3'],
addr:{city:'成都',name:'万达电影城'}});

// 插入多个文档
db.customer.insert([
{name:'张三',age:20},
{name:'李四',sex:'男',age:25},
{name:'王五',sex:'男',fruits:['西瓜','李子','苹果']}
]);

//可指定_id值,但不能重复
db.customer.insert({_id:'0001',name:'小李',age:23});

语法: db.集合名.find({条件文档})

  • 常用条件
use mydb1;
// 查询product下所有文档
db.product.find();
// 查询满足条件的数据
db.product.find({item:'电影票',name:'金刚'});

// 等于$eq、不等$ne、大于$gt、大于等于$gte、小于$lt、小于等于$lte
// 查询name不为金刚的数据
db.product.find({name:{$ne:'金刚'}});

// 并且$and、或者$or、否$not
// 查询stocks大于60或price小于25的数据
db.product.find({$or:[{stocks:{$gt:60}},{price:{$lt:25}}]});
# $not 
db.product.find({item:{$not:{$eq:"电影票"}}});

// 在$in、不在$nin
// 查询price不是10,30的数据
db.product.find({price:{$nin:[10,30]}});
  • 条件字段是数组
// 完全匹配
db.product.find({dates:["2022-9-1","2022-9-2","2022-9-3"]});
// 包含一个元素,日期中含有2022-9-2的数据
db.product.find({dates:"2022-9-2"});
// 包含多个元素 $all
db.product.find({dates:{$all:["2022-9-2","2022-9-3"]}});
// 数组元素个数 $size
db.product.find({dates:{$size:3}});
// 数组字段名.索引编号 0开始
// dates中第二个元素是2022-9-2的数据
db.product.find({"dates.1":"2022-9-2"})
  • 条件字段是文档
// 完全匹配
db.product.find({addr:{city:"成都",name:"万达电影城"}})
// 文档字段.子字段
db.prodcut.find({"addr.city":{$ne:"成都"},"addr.name":"万达电影城"})

指定显示字段:db.集合名.find({条件},{字段:1或0})
注:_id默认显示,除_id:0外,其它字段不能将0和1混用

// 只显示name、price、stocks字段 
db.product.find(
{itme:"电影票"}, #条件
{name:1,price:1,stocks:1,_id:0} #指定字段
);
// 除price、stocks外都显示
db.product.find({},{price:0,stocks:0});

排序:db.集合名.find({条件}).sort({字段:1或-1})

// 按价格升序排
db.product.find().sort({price:1});
// 先价格降序,再库存升序
db.product.find().sort({price:-1,stocks:1});

db.product.find({"addr.ctiy":"成都"},{name:1,addr:1,stocks:1}).sort({stocks:-1});

限制数据数量:db.集合名.find({条件}).limit()

// 显示2条数据
db.product.find().limit(2)

跳过指定数量的数据: db.集合名.find({条件}).skip()

// 显示第6条数据
db.product.find().limit(1).skip(5);

聚合:db.集合名.aggregate()
注:_id是必需的(非文档_id),null表示为全部。_id的值用于分组
$sum、$avg、$min、$max
$push:将值加入一个数组中,不会判断是否有重复
$addToSet:值加入一个数组中,会判断是否有重复,有则不加入
$first:根据排序获取第一个文档数据
$last:根据排序获取最后一个文档数据

// 统计每个价格都有多少部电影
// 可理解为select price,count(*) from product group by price
db.product.aggregate([{$group:{_id:"$price",count_num:{$sum:1}}}]);

// $push 将所有价格加到数组中
db.product.aggregate([{$group:{_id:"name",price:{$push:"$price"}}}])

// $match 将满足stocks大于50小于90的数据交给下个$group处理
db.product.aggregate([
{$match:{stocks:{$gt:50,$lt:90}}},
{$group:{_id:null,first_date:{$first:"$date"}}}
]);

计数:db.集合名.find({条件}).count()

// 票已售空的电影数量
db.product.find({stocks:0}).count();

去重:db.集合名.distinct(字段)

// 查看都有哪些不同的票价
db.product.distinct("price");

语法:

  • 修改一个文档 db.集合名.update({条件},{修改内容})
  • 修改多个文档 db.集合名.updateMany({条件},{修改内容})
use mydb1;
// 增加字段 {$set:{字段名:值}}、{$push:{数组字段名:新元素}}
db.product.updateOne({name:'金刚'},{$set:{other:'very good!'}});
db.product.updateMany({item:'电影票'},{$push:{money:1800}});

// 删除字段 {$unset:{字段名:1}}
db.product.updateMany({},{$unset:{money:1}});

// {$inc:{字段名:改变值}}
db.product.updateOne({name:'金刚'},{$inc:{price:10}}); //票价加10
db.product.updateMany({item:'电影票'},{$inc:{price:-5}}); //票价减5

语法:

  • 删除一个文档db.集合名.deleteOne({条件})
  • 删除多个文档db.集合名.deleteMany({条件})
use mydb1;
// 删一个文档
db.product.deleteOne({name:'金刚'});
// 删集合下所有文档(集合仍在)
db.product.deleteMany({});
// 删集合下满足条件的所有文档
db.product.deleteMany({item:'电影票'});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用,MongoDB性能测试包括了在服务器上进行了5亿数据级别的插入和查询测试,并考虑了GridFS和组合索引的性能。测试中使用了单进程的MongoDB和三个MongoDB进程作为Sharding的两种方案。有关性能方面的具体结果可以参考测试数据和图表。 此外,引用提到在使用Sharding时,MongoDB会时不时对数据进行拆分和搬迁,这可能会导致性能下降。作者建议手动切分数据库或手动创建历史库,而不依赖自动化的Sharding。个人认为,对于MongoDB来说,单个数据库存储不超过1亿条数据比较合适,如果需要存储更大的数据量,最好手动进行分库操作。 总结来说,MongoDB性能测试是通过插入和查询大量数据进行的,考虑了不同的索引和Sharding方案。在实际使用中,需要注意Sharding可能导致的性能下降,可以考虑手动分库来优化性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MongoDB性能测试报告](https://download.csdn.net/download/wuqinlong/7088723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [软件测试Mongodb亿级数据量的性能测试(必看)](https://blog.csdn.net/PythonCS001/article/details/107565443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值