MongoDB索引、聚合、管道

MongoDB索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

createIndex() 方法

MongoDB使用 createIndex() 方法来创建索引。
语法:db.collection.createIndex(keys, options)

db.users.createIndex({name:1}) //创建索引
db.users.getIndexes() // 获取索引
db.users.dropIndexes()// 删除所有索引
db.users.dropIndexe('索引名称') // 获取指定索引

具体参数可以查看菜鸟文档
在这里插入图片描述

MongoDB聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

aggregate() 方法

MongoDB中聚合的方法使用aggregate()。
aggregate() 方法的基本语法格式:db.collection.aggregate(AGGREGATE_OPERATION)

// 数据1
db.getCollection("users").insert( {
    _id: ObjectId("5f43873e333b0000f400710a"),
    name: "李四",
    num: 40
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f43873e333b0000f400710b"),
    name: "王五",
    num: 50
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f43873e333b0000f400710c"),
    name: "赵六",
    num: 90
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f447bf0eb2f0000400009d2"),
    name: "张三",
    num: 55
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f44b221eb2f0000400009d3"),
    name: "张三",
    num: 60
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f44b221eb2f0000400009d4"),
    name: "张三",
    num: 70
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f44b221eb2f0000400009d5"),
    name: "李四",
    num: 60
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f44b221eb2f0000400009d6"),
    name: "李四",
    num: 50
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f44b221eb2f0000400009d7"),
    name: "王五",
    num: 50
} );
db.getCollection("users").insert( {
    _id: ObjectId("5f44b221eb2f0000400009d8"),
    name: "王五",
    num: 80
} );

// 数据2
 db.getCollection("production").insert( {
    _id: ObjectId("5f43893d333b0000f4007117"),
    name: "paper",
    price: 25,
    size: [
        1,2
    ],
} );
db.getCollection("production").insert( {
    _id: ObjectId("5f43893d333b0000f4007118"),
    name: "phone",
    price: 100,
    size: [
         3,4
    ],
} );
db.getCollection("production").insert( {
    _id: ObjectId("5f43893d333b0000f4007119"),
    name: "apple",
    price: 50,
    size: [
        5,6
    ],
} );
db.getCollection("production").insert( {
    _id: ObjectId("5f43893d333b0000f400711a"),
    name: "box",
    price: 75,
    size: [
        7, 8
    ],
} );
-----------------------------------------------------------------
// 根据name计算数量 select name, count(*) from users group by name
db.users.aggregate([{
$group:{
	_id:'$name',
	num_turtoriak:{$sum:1}
}
}]);
// 计算每个用户num总和 select name, sum(num) from users group by name
db.users.aggregate([{
$group:{
	_id:'$name',
	num_turtoriak:{$sum:'$num'}
}
}]);
// 计算每个用户num的平均值 select name,avg(num) from users group by name
db.users.aggregate([{
$group:{
	_id:'$name',
	avg_turtoriak:{$avg:'$num'}
}
}]);
// 查找每个用户num最小值 select name, min(num) from users group by name
db.users.aggregate([{
$group:{
	_id:'$name',
	min_turtoriak:{$min:'$num'}
}
}]);
// 查找每个用户num最大值 select name, max(num) from users group by name
db.users.aggregate([{
$group:{
	_id:'$name',
	min_turtoriak:{$max:'$num'}
}
}]);
// 数组中插入数据 会重复插入数据
db.production.update(
	{_id:ObjectId("5f43893d333b0000f4007117")},
	{
	$push:{'size':11}
	}
);
// 数组中插入数据  如果数据已经存在则不会插入数据
db.production.update(
	{_id:ObjectId("5f43893d333b0000f4007117")},
	{
	$addToSet:{'size':22}
	}
);

MongoDB管道

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

// 只显示name,num列
db.users.aggregate(
    { $project : {
		_id:0,
		name:1,
    	num : 1
    }}
 );

$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

 // $match用于获取num大于50小于或等于80记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
 db.users.aggregate([
	{ $match : { num : { $gt : 50, $lte : 80 } } },
	{ $group: { _id: '$name', count: { $sum: '$num' } } }
]);

$limit:用来限制MongoDB聚合管道返回的文档数。

// 只显示两条数据
db.users.aggregate(
	{$match : { num : { $gt : 50, $lte : 80 } } },
	{$group : { _id: '$name', count: { $sum: '$num' } } },
	{$limit: 2 }
);

$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

// 从第六个开始获取num大于50小于或等于80记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理
db.users.aggregate(
    { $skip : 5 },
	{ $match : { num : { $gt : 50, $lte : 80 } } },
	{ $group: { _id: '$name', count: { $sum: '$num' } } }
);

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

 // 获取_id为5f43893d333b0000f4007117的数组数据
 db.production.aggregate(
	{ $match: {_id : ObjectId("5f43893d333b0000f4007117")} },
	{ $unwind : '$size'}
);

$group:将集合中的文档分组,可用于统计结果。

// 计算每个用户num总和 select name, sum(num) from users group by name
db.users.aggregate([{
$group:{
	_id:'$name',
	num_turtoriak:{$sum:'$num'}
}
}]);

$sort:将输入文档排序后输出。

// 根据num排序 1升序 -1降序
 db.users.aggregate([
	{ $match : { num : { $gt : 50, $lte : 80 } } },
	{ $group: { _id: '$name', num: { $sum: '$num' } } },
	{ $sort: { num : -1 } }
]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值