美文网首页mongodb
MongoDB 实用数组聚合操作 (2)

MongoDB 实用数组聚合操作 (2)

作者: 岛上码农 | 来源:发表于2022-06-01 19:51 被阅读0次

    前言

    上篇MongoDB 实用数组聚合操作 (1)介绍了数组的匹配筛选、字段筛选、分组、求和、最大最小值内容。本篇接续上篇,继续介绍实用的数组聚合操作,使用的测试数据还是上一篇的数据。

    数组展开$unwind

    数组展开是针对某个字段数据类型为数组的,可以针对数组每个元素都展开成一个单独的文档数据,从而可以进行其他操作。

    db.employees.aggregate(
        {$match: {name: '岛上码农'}}, 
      {$unwind: '$languages'}
    ).pretty();
    

    结果为:

    {
        "_id" : ObjectId("60d734f0d8079507891982a8"),
        "name" : "岛上码农",
        "dept" : "研发部",
        "languages" : "Dart",
        "age" : 30,
        "totalExp" : 10
    }
    {
        "_id" : ObjectId("60d734f0d8079507891982a8"),
        "name" : "岛上码农",
        "dept" : "研发部",
        "languages" : "Java",
        "age" : 30,
        "totalExp" : 10
    }
    {
        "_id" : ObjectId("60d734f0d8079507891982a8"),
        "name" : "岛上码农",
        "dept" : "研发部",
        "languages" : "Javascript",
        "age" : 30,
        "totalExp" : 10
    }
    
    

    排序

    可以在聚合操作中指定按某个字段排序,其中1对应升序,-1对应降序。

    db.employees.aggregate(
        [
        {$match: {dept: '研发部'}}, 
        {$project: {'name': 1, 'dept': 1, 'age': 1}}, 
        {$sort: {'age': 1}}
      ]
    ).pretty();
    
    {
        "_id" : ObjectId("60d734f0d8079507891982ad"),
        "name" : "Jenny",
        "dept" : "研发部",
        "age" : 26
    }
    {
        "_id" : ObjectId("60d734f0d8079507891982a8"),
        "name" : "岛上码农",
        "dept" : "研发部",
        "age" : 30
    }
    {
        "_id" : ObjectId("60d734f0d8079507891982ab"),
        "name" : "Cathy",
        "dept" : "研发部",
        "age" : 31
    }
    {
        "_id" : ObjectId("60d734f0d8079507891982a9"),
        "name" : "Amy",
        "dept" : "研发部",
        "age" : 35
    }
    

    跳过指定个数的文档

    使用$sort操作符可以指定跳过前面的元素个数。例如,对上面的例子过滤掉前面3个文档,得到的只剩下第4个元素 Amy

    db.employees.aggregate(
        [
        {$match: {dept: '研发部'}}, 
        {$project: {'name': 1, 'dept': 1, 'age': 1}}, 
        {$sort: {'age': 1}},
        {$skip: 3}
      ]
    ).pretty();
    

    限制返回文档的数量

    使用$limit 操作符可以限制返回文档的数量。

    db.employees.aggregate(
        [
        {$match: {dept: '研发部'}}, 
        {$project: {'name': 1, 'dept': 1, 'age': 1}}, 
        {$sort: {'age': 1}},
        {$limit: 2}
      ]
    ).pretty();
    

    也可以和$skip组合操作,但是需要注意,$skip$limit次序不同结果不同。$skip在前,会先跳过前面的两个文档,然后再限制,而$limit在前会先返回限制数量的文档后再跳过前面的文档。利用这样的组合实际上就可以实现类似 SQL 的分页效果。

    db.employees.aggregate(
        [
        {$match: {dept: '研发部'}}, 
        {$project: {'name': 1, 'dept': 1, 'age': 1}}, 
        {$sort: {'age': 1}},
        {$skip: 2},
        {$limit:2},
      ]
    ).pretty();
    

    总结

    本篇介绍了 MongoDB 的数组聚合操作中的数组元素展开$unwind,数组排序$sort,跳过$skip和限制返回数量$limit等操作,同时组合$skip$limit可以实现分页,下一篇介绍如何在聚合函数中实用条件比较操作符。

    相关文章

      网友评论

        本文标题:MongoDB 实用数组聚合操作 (2)

        本文链接:https://www.haomeiwen.com/subject/jzzxmrtx.html