资讯专栏INFORMATION COLUMN

mongodb如何实现数组对象求和

yintaolaowanzi / 886人阅读

摘要:实现过程中有个执行非常重要,即,官方解释从输入文档中解构一个数组字段,为每个元素输出一个文档。

原本地址:mongodb如何实现数组对象求和

mongodb在计算集合数组值时候,我们通常会想到使用$group$sum,但是如果是数组里面多个json对象,并且还需要根据条件过滤多个对象的内容该如何处理?

现在让我们来实现它,假设mongodb中有个user集合,其数据内容如下:

/* 1 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : [ 
        {
            "app_platform" : "ios",
            "user" : 3028
        },  d
        {
            "app_platform" : "android",
            "user" : 4472
        }, 
    ]
}
...

现在我们需要计算date日期为"2019-01-18 09"并且app_platform的类型为"ios"的user总数

如果可以,请先思考下mongodb语句如何实现。

实现过程中有个执行非常重要,即$unwind,官方解释:

Deconstructs an array field from the input documents to output a document for each element. Each output document is the input document with the value of the array field replaced by the element.

从输入文档中解构一个数组字段,为每个元素输出一个文档。每个输出文档都是输入文档,数组字段的值由元素替换。

于是我们便想到将data数组对象分条拆开,化繁为简,mongodb语句如下:

db.getCollection("user").aggregate([
  {
      $project: { _id: 1, data: 1, date: 1}
  },
  {       
    $match: {"date": "2019-01-18 09"}
  }, 
  {
    $unwind: "$data"
  },
])

得到结果如下:

/* 1 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : {
        "app_platform" : "ios",
        "user" : 3028
    }
}
/* 2 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : {
        "app_platform" : "android",
        "user" : 4472
    }
}

可以看到数据由数组变成了多条文档数据,于是问题转变为计算结果的user总数,是不是觉得问题变简单了,而且我们也可以继续使用$match来过滤app_platform数据,mongodb语句如下:

db.getCollection("user").aggregate([
  {
      $project: { _id: 1, data: 1, date: 1}
  },
  {       
    $match: {"date": "2019-01-18 09"}
  }, 
  {
    $unwind: "$data"
  },
   {
    $match: {
      "data.app_platform": { $in: ["ios"]}
    },
   }
])

执行结果如下:

/* 1 */
{
    "_id" : ObjectId("5c414a6a0847e00385143003"),
    "date" : "2019-01-18 09",
    "data" : {
        "app_platform" : "ios",
        "user" : 3028
    }
}

可以看到数据已经被过滤了,如果自信观察两个$match的作用可以发现,mongodb是按顺序执行的,即$match作用于其前面的操作结果集合

让我们继续计算,此时只需要使用group与sum对data里的user字段求和即可,mongodb语句如下:

db.getCollection("user").aggregate([
  {
      $project: { _id: 1, data: 1, date: 1}
  },
  {       
    $match: {"date": "2019-01-18 09"}
  }, 
  {
    $unwind: "$data"
  },
  {
    $match: {
      "data.app_platform": { $in: ["ios"]}
   }
  },
  {
    $group: { _id: null, "user": {$sum: "$data.user"}}
  }
])

结果如下:

/* 1 */
{
    "_id" : null,
    "user" : 7500
}

计算得出的user即我们所需要的数据。

其实所有的难点如下:

计算数组对象数据时将其转变为多条简单的数据格式,$unwind指令将问题轻松得降低了难度

mongodb的执行顺序,$project$match都是顺序执行并作用于之前的操作结果

理解了这两点,相信再难的mongodb语句你也能实现。

happy coding!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19458.html

相关文章

  • MongoDB管道操作符(二)

    摘要:上篇文章中我们已经学习了中几个基本的管道操作符,本文我们再来看看其他的管道操作符。算术操作符通过算术操作符我们可以对分组后的文档进行求和或者求平均数。好了,中的管道操作符我们就先说到这里,小伙伴们有问题欢迎留言讨论。 上篇文章中我们已经学习了MongoDB中几个基本的管道操作符,本文我们再来看看其他的管道操作符。 本文是MongoDB系列的第十三篇文章,了解前面的文章有助于更好的理...

    张率功 评论0 收藏0
  • mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)

    摘要:简述从字面上来理解就是两个过程映射以及化简。在映射化简的过程都是每台服务器自己的在运算,大量的服务器同时来进行运算工作,这就是大数据基本理念。映射操作输出了键值对结果。在中,所有的映射化简函数都是使用编写,并且运行在进程中。 简述 mapReduce从字面上来理解就是两个过程:map映射以及reduce化简。是一种比较先进的大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N...

    madthumb 评论0 收藏0
  • Spring Boot 中使用 MongoDB 增删改查

    摘要:声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从中取出的数据省略接口提供增删改查接口实现提供增删改查接口实现提供了一个类似于的设计的类。 本文快速入门,MongoDB 结合SpringBoot starter-data-mongodb 进行增删改查 1、什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。...

    ranwu 评论0 收藏0
  • 「译」 MapReduce in MongoDB

    摘要:在第行中,我们会从集合取得结果并显示它。的逻辑在中,我们要以性别作为,然后以作为。年龄是用来做计算用的,而名字只是用来显示给人看的。我们要检查所有和性别相关的年龄,找到年龄最大和最小的用户。 在这篇文章里面,我们会演示如何在 MongoDB 中使用 MapReduce 操作。我们会用 dummy-json 这个包来生成一些虚假的数据,然后用 Mongojs 如果想要快速看到结果,可以到...

    ConardLi 评论0 收藏0
  • 斐波那契数列求和的js方案以及优化

    摘要:在上做了一道斐波那契数列求和的题目,做完之后做了一些简单的优化和用另一种方法实现。动态规划解决方案斐波那契数列求和除了可以用递归的方法解决,还可以用动态规划的方法解决。 在codewars上做了一道斐波那契数列求和的题目,做完之后做了一些简单的优化和用另一种方法实现。 题目 function fibonacci(n) { if(n==0 || n == 1) r...

    xinhaip 评论0 收藏0

发表评论

0条评论

yintaolaowanzi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<