这篇文章主要给大家介绍了关于mongodb实现数组对象求和的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

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

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

pk10开奖结果现在我们需要计算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
  }
}

pk10开奖结果可以看到数据已经被过滤了,如果自信观察两个$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都是顺序执行并作用于之前的操作结果

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

happy coding!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对爱安网的支持。

最新资讯
小盒科技CEO刘夜谈AI课:技术背后 人文很重要

小盒科技CEO刘夜谈AI

近日作业盒子举办品牌升级暨战略发布会,宣布了“作业盒
阿里回港二次上市:将和港股“股王”腾讯强势对垒?

阿里回港二次上市:将和

时间倒回至5年前,2014年9月15日,阿里在纽交所递交IPO申
人类登月50周年:致敬那些为登月献出的生命

pk10开奖结果人类登月50周年:致敬那

整整50年了,距离人类首次登上月球。
又一暴雪联合创始人宣布离职:结束28年暴雪工作生涯

又一暴雪联合创始人宣

今天上午,暴雪娱乐的联合创始人之一Frank Pearce宣布正
快递员不得随意将包裹放快件箱,能否终结懒人送件

快递员不得随意将包裹

未经收件人同意,快递员将不得随意把包裹放进智能快件箱
苹果面临“果粉”忠诚度下降危机

苹果面临“果粉”忠诚

高盛指出,由于App商店的销售业绩增长缓慢,苹果股价恐怕
最新文章
mongo中模糊查询的综合应用

mongo中模糊查询的综

这篇文章主要给大家介绍了关于mongo中模糊查询的相关
mongoDB中聚合函数java处理示例详解

mongoDB中聚合函数jav

这篇文章主要给大家介绍了关于mongoDB中聚合函数java
MongoDB实现自动备份的全过程记录

MongoDB实现自动备份

这篇文章主要给大家介绍了关于MongoDB实现自动备份的
Ubuntu 18.04安装MongoDB 4.0 的教程详解

Ubuntu 18.04安装Mong

这篇文章主要介绍了Ubuntu 18.04安装MongoDB 4.0 的教
MongoDB副本集丢失数据的测试实例教程

MongoDB副本集丢失数

这篇文章主要给大家介绍了关于MongoDB副本集丢失数据
MongoDB的基本特性与内部构造的讲解

MongoDB的基本特性与

今天小编就为大家分享一篇关于MongoDB的基本特性与内
pk10开奖结果_xeIsthm pk10开奖结果_WavPJ pk10开奖结果_nO2Do pk10开奖结果pk10开奖结果_VPEjFGy pk10开奖结果_MWWGB pk10开奖结果pk10开奖结果_jTRZJ8E pk10开奖结果_0QSe2l pk10开奖结果_fohqO pk10开奖结果_WqwqjO pk10开奖结果_1tFlJ2