无法使用node.js在MongoDB中基于特定字符串对值进行分组?

莎兰·凯南

我有一个用例,其中有3个集合。即,每个模板的模板,组和1-动态集合,将在创建模板后立即创建。

每个模板由devices每个device组成的groupId群体集合。动态收集存储模板设备推送的数据。

以下是我的收藏的样本数据。

模板数据

{
  "_id": "5e0ae38729218b0a3861118b",
  "templateId": "13435158964",
  "devices": [
    {
      "deviceId": "a-1",
      "_id": "5e0ae49629218b0a3861118f",
      "group": "5e0ae41d29218b0a3861118d",
    },{
       "deviceId": "sb-0001",
       "_id": "5e0af166981f39410cd89b72",
       "group": "5e0af11d981f39410cd89b70"
    }]
}

动态收集数据

[
  {
      "_id": "5e0ae793b1384737a4f855cf",
      "template": "13435158964",
      "deviceId": "a-1",
      "heat": 30,
      "humidity": 40
    },
    {
      "_id": "5e0ae7a2b1384737a4f855d0",
      "template": "13435158964",
      "deviceId": "sb-0001",
      "heat": 40,
      "humidity": 20
    },
    {
      "_id": "5e0ae890b1384737a4f855d3",
      "template": "13435158964",
      "deviceId": "a-1",
      "heat": 10,
      "humidity": 20
    },
    {
      "_id": "5e0af188981f39410cd89b73",
      "template": "13435158964",
      "deviceId": "a-1",
      "heat": 60,
      "humidity": 50
    },
    {
      "_id": "5e0af196981f39410cd89b74",
      "template": "13435158964",
      "deviceId": "sb-0001",
      "heat": 15,
      "humidity": 25
    }]

组数据

[{
   "_id": "5e0af11d981f39410cd89b70",
   "template": "5e0ae38729218b0a3861118b",
   "groupName": "Flats"
 },{
    "_id": "5e0ae41d29218b0a3861118d",
    "template": "5e0ae38729218b0a3861118b",
    "groupName": "Swimming Pool"
 }]

因此,对于以上数据,我正在尝试获取groupName指定温度的热量和湿度的总和因此,预期输出应为:

预期产量

[
  {
    "_id": "Swimming Pool",
    "heat": 110,
    "humidity": 165,
    "count":2
  },{
    "_id": "Flat",
    "heat": 70,
    "humidity": 80,
    "count":1
  }]

**返回的输出**

[
  {
    "_id": "Swimming Pool",
    "heat": 180,
    "humidity": 245,
    "count":2
  },{
    "_id": "Flat",
    "heat": 180,
    "humidity": 245,
    "count":1
  }]

我不确定如何实现这一目标,有谁能帮助我解决问题

我的查询:在这里,模板和组是不同的集合。

db.getCollection('13435158964').aggregate([
{ "$match": {"entryDayTime":{
                    $lt: new Date("2019-11-29T18:30:00.000Z"),
                    $gte: new Date("2019-10-31T18:30:00.000Z")
                }
}
},{
    $lookup:{
        from:"templates",
        localField:"template",
        foreignField:"templateId",
        as:"templateData"
    }
},{
    $unwind:"$templateData"
},{
    $unwind:"$templateData.devices"
},{
    $lookup:{
       from:"groups",
       localField:"templateData.devices.group",
       foreignField:"_id",
       as:"groupData"
     }
},{
    $unwind:"$groupData"
},{
    $group:{
       _id: "$groupData.groupName",
       heat:{$sum:"$heat"},
       humidity:{$sum:"$humidity"},
       count:{$sum:1}
    }
},{
    $project:{
       "count":1,"heat":1,"humidity":1,"templateData.devices.group":1,"templateData.devices.deviceId":1,"groupData.groupName":1
}
}])
阿拉文

据我了解,您期​​望将数据按组名分组。但是您得到了错误的结果。

因此,请参考以下聚合代码。

db.getCollection('13435158964').aggregate([
  {
    $lookup: {
      from: "templates",
      localField: "template",
      foreignField: "templateId",
      as: "templateData"
    }
  },
  {
    $unwind: "$templateData"
  },
  {
    $unwind: "$templateData.devices"
  },
  {
    $match: {
      $expr: {
        $eq: [
          "$deviceId",
          "$templateData.devices.deviceId"
        ]
      }
    }
  },
  {
    $lookup: {
      from: "groups",
      localField: "templateData.devices.group",
      foreignField: "_id",
      as: "groupData"
    }
  },
  {
    $unwind: "$groupData"
  },
  {
    $group: {
      _id: "$groupData.groupName",
      heat: {
        "$sum": "$heat"
      },
      humidity: {
        "$sum": "$humidity"
      },
      count: {
        "$sum": 1
      }
    }
  }
])

你会得到这样的答案,

[
  {
    "_id": "Swimming Pool",
    "count": 3,
    "heat": 100,
    "humidity": 110
  },
  {
    "_id": "Flats",
    "count": 2,
    "heat": 55,
    "humidity": 45
  }
]

您也可以参考此链接,https://mongoplayground.net/p/hr95U1eT5bL

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用基于字符串中的字符的比较器对字符串数组进行排序

来自分类Dev

如何使用Ember.js在模板中显示特定的字符串而不是模型值?

来自分类Dev

使用Node JS进行字符串操作

来自分类Dev

使用Node JS进行字符串操作

来自分类Dev

使用dplyr对每行(行)中的特定字符串(字符串)进行计数或求和

来自分类Dev

使用 dict.values() 进行迭代时,无法替换字典列表中的字符串值

来自分类Dev

使用javascript从字符串中获取特定值

来自分类Dev

如何从Node.js中的给定字符串中提取特定字符串

来自分类Dev

无法使用C#获得JSON字符串中的特定值

来自分类Dev

如何使用Node.js检索内容中不包含特定字符串的文件

来自分类Dev

使用pentaho排除具有特定值的数据[字符串中的子字符串]

来自分类Dev

无法使用Node.js从Mongodb中获取数据

来自分类Dev

无法使用 node-mysql 进行分页

来自分类Dev

通过SSH无法使用node.js

来自分类Dev

无法使用Node.js读取文件

来自分类Dev

无法使用Node JS ipp模块打印

来自分类Dev

无法使用Node.js读取文件

来自分类Dev

无法在Node.js中使用jQuery

来自分类Dev

在linq中使用GroupBy对字符串字母进行分组

来自分类Dev

使用linq对包含子字符串的表进行分组

来自分类Dev

使用XSLT对子字符串进行分组

来自分类Dev

如何在数组mongodb下的子文档中使用日期字符串对数据进行分组

来自分类Dev

Node js,Mongoose查询以将ID与以逗号分隔的字符串存储的值进行匹配

来自分类Dev

Node.js-Mongodb-猫鼬/无法将数组字符串传递到$ push领域

来自分类Dev

如何使用 Parsec (Haskell) 基于密钥标记将值插入到字符串中?

来自分类Dev

使用 c# 从基于优先级的 csv 字符串中检索值

来自分类Dev

使用cross和.names进行更改:“胶水无法将函数插值到字符串中”错误

来自分类Dev

使用java 8 Stream按第一个值对字符串数组进行分组

来自分类Dev

在Node.js中,如何读取文件,在指定行附加字符串或从特定行删除字符串?

Related 相关文章

  1. 1

    使用基于字符串中的字符的比较器对字符串数组进行排序

  2. 2

    如何使用Ember.js在模板中显示特定的字符串而不是模型值?

  3. 3

    使用Node JS进行字符串操作

  4. 4

    使用Node JS进行字符串操作

  5. 5

    使用dplyr对每行(行)中的特定字符串(字符串)进行计数或求和

  6. 6

    使用 dict.values() 进行迭代时,无法替换字典列表中的字符串值

  7. 7

    使用javascript从字符串中获取特定值

  8. 8

    如何从Node.js中的给定字符串中提取特定字符串

  9. 9

    无法使用C#获得JSON字符串中的特定值

  10. 10

    如何使用Node.js检索内容中不包含特定字符串的文件

  11. 11

    使用pentaho排除具有特定值的数据[字符串中的子字符串]

  12. 12

    无法使用Node.js从Mongodb中获取数据

  13. 13

    无法使用 node-mysql 进行分页

  14. 14

    通过SSH无法使用node.js

  15. 15

    无法使用Node.js读取文件

  16. 16

    无法使用Node JS ipp模块打印

  17. 17

    无法使用Node.js读取文件

  18. 18

    无法在Node.js中使用jQuery

  19. 19

    在linq中使用GroupBy对字符串字母进行分组

  20. 20

    使用linq对包含子字符串的表进行分组

  21. 21

    使用XSLT对子字符串进行分组

  22. 22

    如何在数组mongodb下的子文档中使用日期字符串对数据进行分组

  23. 23

    Node js,Mongoose查询以将ID与以逗号分隔的字符串存储的值进行匹配

  24. 24

    Node.js-Mongodb-猫鼬/无法将数组字符串传递到$ push领域

  25. 25

    如何使用 Parsec (Haskell) 基于密钥标记将值插入到字符串中?

  26. 26

    使用 c# 从基于优先级的 csv 字符串中检索值

  27. 27

    使用cross和.names进行更改:“胶水无法将函数插值到字符串中”错误

  28. 28

    使用java 8 Stream按第一个值对字符串数组进行分组

  29. 29

    在Node.js中,如何读取文件,在指定行附加字符串或从特定行删除字符串?

热门标签

归档