mongodb如何实现数组对象求和

栏目: 数据库 · 发布时间: 5年前

内容简介:原本地址:mongodb在计算集合数组值时候,我们通常会想到使用现在让我们来实现它,假设

原本地址: 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 ,官方解释:

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

于是我们便想到将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即我们所需要的数据。

其实所有的难点如下:

  1. 计算数组对象数据时将其转变为多条简单的数据格式, $unwind 指令将问题轻松得降低了难度
  2. mongodb的执行顺序, $project$match 都是顺序执行并作用于之前的操作结果

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

happy coding!


以上所述就是小编给大家介绍的《mongodb如何实现数组对象求和》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Websites with Joomla!

Building Websites with Joomla!

H Graf / Packt Publishing / 2006-01-20 / USD 44.99

This book is a fast paced tutorial to creating a website using Joomla!. If you've never used Joomla!, or even any web content management system before, then this book will walk you through each step i......一起来看看 《Building Websites with Joomla!》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具