代码之家  ›  专栏  ›  技术社区  ›  Manolait

使用push和group在MongoDB中进行聚合

  •  0
  • Manolait  · 技术社区  · 6 年前

    我正试图对两个集合进行聚合,但我没有得到它,我还想用一个push对所有的集合进行分组。

    这是我的传感器系列:

    {
        "_id": ObjectId ("5b3e3ce0f0ed5174a3097cde"),
        "name": "co2_int",
        "type": "climate",
        "place": "interior",
        "user": ObjectId ("5b10176084195a07f63c942a"),
        "greenhouse": ObjectId ("5b1027896933440c030f8a6b"),
        "__v": 0
    }
    

    数据报主机集合:

    {
        "_id": ObjectId ("5b3e40d6f0ed5174a3097f4e"),
        "name": "co2_ext",
        "timestamp": ISODate ("2018-08-30T16: 25: 13.159Z"),
        "value": "200",
        "greenhouse": ObjectId ("5b1027896933440c030f8a6b"),
        "sensor": ObjectId ("5b1027dc6933440c030f8a6e"),
        "__v": 0
    }
    

    这是我的总结:

    Datagreenhouse.aggregate ([
    
        {"$ match": {
        "name": {$ in: arr}}},
        {
          "$ lookup": {
              "from": "sensor",
              "localField": "_id",
              "foreignField": "_id.sensor",
              "as": "sensor_type"
          }
        },
    
    
        {"$ group": {
            "_id": {
                "timestamp": "$ timestamp",
                "name": "$ name",
                "value": "$ value",
                "sensor_type": "$ sensor_type"
            },
            "Count": {"$ sum": 1}
        }},
    
        // {$ unwind: '$ type'},
        {"$ group": {
            "_id": "$ _id.timestamp",
            "measurements": {
                "$ push": {
                    "name": "$ _id.name",
                    "count": "$ Count",
                    "value": "$ _id.value",
                    "sensor_type": "$ _id"
                },
            },
            "count": {"$ sum": "$ Count"}
        }},
        {"$ sort": {"_id": -1}},
        {"$ limit": 1}
        ]
    

    我需要恢复与该数据相关联的传感器采集位置。

    回答:

    {
                "_id": "2018-08-30T16: 25: 13.159Z",
                "measurements": [
                    {
                        "name": "temperature_int",
                        "count": 1,
                        "value": "33",
                        "sensor_type": {
                            "timestamp": "2018-08-30T16: 25: 13.159Z",
                            "name": "temperature_int",
                            "value": "33",
                            "sensor_type": []
                        }
                    },
                    {
                        "name": "co2_int",
                        "count": 1,
                        "value": "70",
                        "sensor_type": {
                            "timestamp": "2018-08-30T16: 25: 13.159Z",
                            "name": "co2_int",
                            "value": "70",
                            "sensor_type": []
                        }
                    },
                    {
                        "name": "temperatura_ext",
                        "count": 1,
                        "value": "90",
                        "sensor_type": {
                            "timestamp": "2018-08-30T16: 25: 13.159Z",
                            "name": "temperatura_ext",
                            "value": "90",
                            "sensor_type": []
                        }
                    }
                ],
                "count": 3
            }
    

    我不知道如何解决这个问题。

    致以问候和感谢。

    *****编辑*****

    我编辑的文章工作不正常,它总是显示相同的值的地方

    {
        "DatagreenhouseRecuperado": [
            {
                "_id": "2018-08-30T16:25:13.159Z",
                "medidas": [
                    {
                        "name": "co2_ext",
                        "count": 1,
                        "value": "200",
                        "place": "interior"
                    },
                    {
                        "name": "co2_int",
                        "count": 1,
                        "value": "70",
                        "place": "interior"
                    },
                    {
                        "name": "temperatura_ext",
                        "count": 1,
                        "value": "90",
                        "place": "interior"
                    },
                    {
                        "name": "temperatura_int",
                        "count": 1,
                        "value": "45",
                        "place": "interior"
                    }
                ],
                "count": 4
            }
        ]
    }
    

    如果名称为“ext”,则必须将“exterior”而不是“interior”置于“collection sensor”中字段值所在的位置。

    Aggregarion公司:

    Datagreenhouse.aggregate([
    
        {"$match": {
        "name" : { $in: arr }} },
        {
          "$lookup": {
              "from": "sensors",
              "localField": "sensor",
              "foreignField": "_id",
              "as": "sensor"
          }
        },
        {"$unwind":"$sensor"},
        { "$group": {
            "_id": {
                "timestamp": "$timestamp",
                "name": "$name",
                "value": "$value",
                "sensor_type": "$sensor.type"
    
            },
            //"sensor":{"$first":"$sensor"},
            "place":{"$first":"$sensor.place"},
            "Count": { "$sum": 1 }
        }},
    
        //{$unwind:'$type'},
        { "$group": {
            "_id": "$_id.timestamp",
            "medidas": {
                "$push": {
                    "name": "$_id.name",
                    "count": "$Count",
                    "value": "$_id.value",
                    //"sensor_type":"$ _id.sensor_type",
                    //"sensor":"$sensor"
                    "sensor_type":"$ _id.sensor_type",
                    "place":"$place"
                },
            },
            "count": { "$sum": "$Count" }
        }},
        { "$sort": { "_id": -1 } },
        { "$limit": 1 }
        ]
    

    收藏:

    {
        "_id" : ObjectId("5b1027e46933440c030f8a6e"),
        "name" : "temperatura_ext",
        "type" : "clima",
        "place" : "exterior",
        "usuario" : ObjectId("5b10176084195a07f63c942a"),
        "invernadero" : ObjectId("5b1027896933440c030f8a6b"),
        "__v" : 0
    }
    

    ***编辑02*****

    我的最终目标是:

    {
                "_id": "2018-08-30T16: 25: 13.159Z",
                "measurements": [
                    {
                        "name": "temperature_int",
                        "count": 1,
                        "value": "45",
                        "place": "interior"
                    },
                    {
                        "name": "co2_ext",
                        "count": 1,
                        "value": "200",
                        "place": "exterior"
                    },
                    {
                        "name": "temperatura_ext",
                        "count": 1,
                        "value": "90",
                        "place": "exterior"
                    },
                    {
                        "name": "co2_int",
                        "count": 1,
                        "value": "70",
                        "place": "interior"
                    }
                ],
                "count": 4
            }
    

    “位置”字段必须是指传感器集合的真实字段,我只需要输入该字段的值。现在他总是给我同样的价值。

    1 回复  |  直到 6 年前
        1
  •  1
  •   s7vr    6 年前

    $unwind $push

    Datagreenhouse.aggregate([
      {"$match":{"name":{"$in":arr}}},
      {"$lookup":{"from":"sensor","localField":"sensor","foreignField":"_id","as":"sensor"}},
      {"$unwind":"$sensor"},
      {"$ group":{
        "_id":{
          "timestamp":"$timestamp",
          "name":"$name",
          "value":"$value",
          "sensor_type":"$sensor.type",
          "place":"$sensor.place"
        },
        "Count":{"$sum":1}
      }},
      {"$ group":{
        "_id":"$_id.timestamp",
        "measurements":{
          "$ push":{
            "name":"$_id.name",
            "count":"$Count",
            "value":"$_id.value",
            "sensor_type":"$ _id.sensor_type",
            "place":"$_id.place"
          }},
          "count":{"$sum":"$Count"}
      }},
      {"$sort":{"_id":-1}},
      {"$limit":1}
    ])
    

    Datagreenhouse.aggregate([
      {"$match":{"name":{"$in":arr}}},
      {"$lookup":{
         "from":"sensor",
          "localField":"_id",
          "foreignField":"greenhouse",
          "as":"sensor"
      }},
      {
        "$addFields": {
          "sensor": {
            "$map": {
              "input":"$sensor",
              "as": "sen",
              "in": {
                "place":"$$sen.place"
              }
            }
          }
        }
      },
      {"$group":{
        "_id":{
          "timestamp":"$timestamp",
          "name":"$name",
          "value":"$value"
        },
        "sensor":{$first:"$sensor"},
        "Count":{"$sum":1}
      }},
      {$"unwind":"$sensor"},
      {"$group":{
        "_id":"$_id.timestamp",
          "measurements":{
          "$ push":{
            "name":"$_id.name",
            "count":"$sensor",
            "value":"$_id.value",
            "place":"$_id.place"
          }},     
         "count":{"$sum":"$Count"}
      }},
      {"$sort":{"_id":-1}},
      {"$limit":1}
    ])