1,关于聚合(aggregate)
db.collection.aggregate(组合条件)
经常与管道操作符搭配使用,常用的管道操作符
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
常用的
aggregate([ {
// $match 条件筛选,和find查询条件一致
$match: {
$did: ["$in"=>[12341,232321]],
'showcase.deleted': false,) // 筛选id的话,需要使用object进行转换
}
},
{
// $group 分组做数据统计
$group: {
_id: { // _id 查询条件---这两个字段为索引
article: '$article',
name: '$name'
},
accessedTimes: {$sum: 1}, // $sum: 总共查询到几条数据
firstAccessed: {$first: '$created'}, // $first:查询到的集合中第一条数据的created字段值
lastAccessed: {$last: '$created'}, // $last:查询到的集合中最后一条数据的created字段值
}
}, {
$project: { // 指定要显示的字段
'articleDetail.title': 1,
'articleDetail.coverImage.smallURL': 1,
accessedTimes: 1,
firstAccessed: 1,
lastAccessed: 1,
lastLocation: 1
}
}{
// $lookup 可以多次调用
$lookup: {
from: 'trainingDocuments', //要查询的表名字
localField: 'article', //在当前表(Entry)里的对应字段
foreignField: '_id', //trainingDocuments表里article对应的字段
as: 'articleDetail' //结果会在Entry表里添加一个articleDetail字段,内容是trainingDocuments表里查到的那条数据,新的articleDetail会被放在数组中,可以用$unwind拆开这个数组
}
}, {
// $unwind 拆开数组
$unwind: '$articleDetail' //如果articleDetail是数组,就会把数组拆开
}, {
$lookup: {
from: 'files',
localField: 'articleDetail.coverImage', //嵌套查询,使用嵌套查询条件'articleDetail.coverImage'时注意,要用$unwind把articleDetail拆开才能这样查询
foreignField: '_id',
as: 'articleDetail.coverImage'
}
}, {
$unwind: '$articleDetail.coverImage'
},{
// $sort 排序
$sort: {'createTime': -1} // 按指定字段排序
},{
// $limit 限制显示条数
$limit: parseInt(limit * page) // 限制显示条数,结合$skip可以做分页
},{
// $skip 查询跳过多少条数据
$skip: parseInt(limit * (page - 1)) // 每次跳过多少条数据
}] );
在写代码的过程中有遇到两个group的情况
{
“campaign_id”: “A”,
“campaign_name”: “A”,
“subscriber_id”: “123”
},
{
“campaign_id”: “A”,
“campaign_name”: “A”,
“subscriber_id”: “123”
},
{
“campaign_id”: “A”,
“campaign_name”: “A”,
“subscriber_id”: “456”
}
按照 campaign_id 与 campaign_name 分组,并查询出每个分组下的记录条数 及 subscriber_id
不同记录的个数
db.campaigns.aggregate([
{ "$match": {
"subscriber_id": {
"$ne": null
}}},
// Count all occurrences
{ "$group": {
"_id": {
"campaign_id": "$campaign_id",
"campaign_name": "$campaign_name",
"subscriber_id": "$subscriber_id"
},
"count": { "$sum": 1 }
}},
// Sum all occurrences and count distinct
{ "$group": {
"_id": {
"campaign_id": "$_id.campaign_id",
"campaign_name": "$_id.campaign_name"
},
"totalCount": { "$sum": "$count" },
"distinctCount": { "$sum": 1 }
}}
文档结果:
第一个 group:
{
“_id” : {
“campaign_id” : “A”,
“campaign_name” : “A”,
“subscriber_id” : “456”
},
“count” : 1 }
{
“_id” : {
“campaign_id” : “A”,
“campaign_name” : “A”,
“subscriber_id” : “123”
},
“count” : 2 }
第二个 group:
{
“_id” : {
“campaign_id” : “A”,
“campaign_name” : “A”
},
“totalCount” : 3,
“distinctCount” : 2 }
至此,我们已经查询出一共有 3 条记录,subscriber_id 有两种不同的值