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 } }
]);