mongodb使用小结

1,关于聚合(aggregate)

db.collection.aggregate(组合条件)

经常与管道操作符搭配使用,常用的管道操作符
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。matchmatch使用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 有两种不同的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值