$project $lookup 值未显示在 $group 之后

$project $lookup value not shown after $group

我有 2 个相关的 collection,我想做一个 $lookup

  1. 开关
{ 
    "_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "relay" : NumberInt(1), 
    "name" : "Lampu Tengah", 
    "voltage" : 80.0, 
    "duration" : null, 
    "status" : true, 
    "triggered_by" : ObjectId("5e5fd642fce106005319e884"), 
    "created_at" : ISODate("2020-04-01T15:41:36.588+0000"), 
    "updated_at" : ISODate("2020-04-01T22:59:39.261+0000")
}
{ 
    "_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "relay" : NumberInt(2), 
    "name" : "Kipas Angin", 
    "voltage" : 100.0, 
    "duration" : null, 
    "status" : true, 
    "triggered_by" : ObjectId("5e5fd642fce106005319e884"), 
    "created_at" : ISODate("2020-04-01T15:45:48.099+0000"), 
    "updated_at" : ISODate("2020-04-01T15:45:48.099+0000")
}
  1. power_usage_month
{ 
    "_id" : ObjectId("5e87edffffba850e8d72ce27"), 
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 19.345, 
    "time_minutes" : NumberInt(123), 
    "created_at" : ISODate("2020-04-02T15:01:37.521+0000"), 
    "updated_at" : ISODate("2020-04-02T15:01:37.521+0000")
}
{ 
    "_id" : ObjectId("5e87ee06ffba850e8d72ce28"), 
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 17.5, 
    "time_minutes" : NumberInt(123), 
    "created_at" : ISODate("2020-04-03T20:35:09.870+0000"), 
    "updated_at" : ISODate("2020-04-03T20:35:09.871+0000")
}
{ 
    "_id" : ObjectId("5e87ee0cffba850e8d72ce29"), 
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 19.345, 
    "time_minutes" : NumberInt(124), 
    "created_at" : ISODate("2020-04-04T01:45:00.000+0000"), 
    "updated_at" : ISODate("2020-04-04T01:45:00.000+0000")
}
{ 
    "_id" : ObjectId("5e87ee13ffba850e8d72ce2a"), 
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 17.5, 
    "time_minutes" : NumberInt(124), 
    "created_at" : ISODate("2020-04-04T01:45:00.000+0000"), 
    "updated_at" : ISODate("2020-04-04T01:45:00.000+0000")
}
{ 
    "_id" : ObjectId("5e87ee18ffba850e8d72ce2b"), 
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 19.345, 
    "time_minutes" : NumberInt(125), 
    "created_at" : ISODate("2020-04-04T01:45:00.000+0000"), 
    "updated_at" : ISODate("2020-04-04T01:45:00.000+0000")
}
{ 
    "_id" : ObjectId("5e87ee20ffba850e8d72ce2c"), 
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 17.5, 
    "time_minutes" : NumberInt(125), 
    "created_at" : ISODate("2020-04-04T01:45:00.000+0000"), 
    "updated_at" : ISODate("2020-04-04T01:45:00.000+0000")
}
{ 
    "_id" : ObjectId("5e87ee26ffba850e8d72ce2d"), 
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 19.345, 
    "time_minutes" : NumberInt(126), 
    "created_at" : ISODate("2020-04-04T01:45:00.000+0000"), 
    "updated_at" : ISODate("2020-04-04T01:45:00.000+0000")
}
{ 
    "_id" : ObjectId("5e87ee2dffba850e8d72ce2e"), 
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "current" : 17.5, 
    "time_minutes" : NumberInt(126), 
    "created_at" : ISODate("2020-04-04T01:45:00.000+0000"), 
    "updated_at" : ISODate("2020-04-04T01:45:00.000+0000")
}

现在我想 "join" 这些 collection 使用 $lookup 和 $project 我想显示的字段,但显然 $project 值不会显示在我做了 $group 之后。这是我的查询

db.getCollection("power_usages_month").aggregate(
    [
        { 
            "$project" : { 
                "_id" : NumberInt(0), 
                "power_usages_month" : "$$ROOT"
            }
        }, 
        { 
            "$lookup" : { 
                "localField" : "power_usages_month.switch_id", 
                "from" : "switches", 
                "foreignField" : "_id", 
                "as" : "switches"
            }
        }, 
        { 
            "$unwind" : { 
                "path" : "$switches", 
                "preserveNullAndEmptyArrays" : false
            }
        }, 
        { 
            "$group" : { 
                "_id" : "$power_usages_month.switch_id",
                "sum_current" : { 
                    "$sum" : "$power_usages_month.current"
                }
            }
        }, 
        { 
            "$project" : { 
                "switch_id" : "$_id", 
                "device_id" : "$switches.device_id",
                "sum_current" : "$sum_current", 
                "voltage" : "$switches.voltage",
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

根据结果,"device_id" : "$switches.device_id","voltage" : "$switches.voltage"无法正常出现:

{ 
    "_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "sum_current" : 70.0
}
{ 
    "_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "sum_current" : 77.38
}

怎么可能?请告诉我查询的错误..

编辑:这是我想要的结果

{ 
    "_id" : ObjectId("5e8454bc95c85ca0c33a9463"), 
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"),
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"),
    "sum_current" : 70.0,
    "voltage" : 80.0

}
{ 
    "_id" : ObjectId("5e8453c095c85ca0c33a9461"), 
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"),
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"), 
    "sum_current" : 77.38,
    "voltage" : 100.0

}

你可以把项目作为分组后的最后一步来做,$lookup 你也可以在小组中处理所有这些, 您将包含在 $group 中的内容将仅在查询中对您可用, 但是假设您需要收集该开关中一个数组中每个开关使用的 power_usages_month 文档, 但是您不需要 power_usages_month 中的所有信息,您只需要 currenttime_minutes 例如

你可以这样做

db.powerUsageMonth.aggregate(
    [
        {
            $match: {}
        },
        {
            $lookup: {
                from: 'switches',
                localField: 'switch_id',
                foreignField: '_id',
                as: 'switch'
            }
        },
        {
            $unwind: '$switch'
        },
        {
            $group: {
                _id: '$switch._id',
                sum_current: {
                    $sum: '$current'
                },
                switchInfo: {
                    $first: '$switch'
                },
                powerUsageDocs: {
                    $addToSet: '$$ROOT'
                }
            }
        },
        {
            $project: {
                _id: 1,
                sum_current: 1,
                switchInfo: 1,
                'powerUsageDocs.current': 1,
                'powerUsageDocs.time_minutes': 1,
            }
        }
    ]
)

这将 return 一组开关及其总电流和开关信息(如果您不需要所有开关信息,您也可以在这里做一些投影),以及相关的电源使用文档到此开关(投影后)

结果会是这样的

{
    "_id" : ObjectId("5e8454bc95c85ca0c33a9463"),
    "sum_current" : 70,
    "switchInfo" : {
        "_id" : ObjectId("5e8454bc95c85ca0c33a9463"),
        "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"),
        "relay" : 2,
        "name" : "Kipas Angin",
        "voltage" : 100,
        "duration" : null,
        "status" : true,
        "triggered_by" : ObjectId("5e5fd642fce106005319e884"),
        "created_at" : ISODate("2020-04-01T15:45:48.099Z"),
        "updated_at" : ISODate("2020-04-01T15:45:48.099Z")
    },
    "powerUsageDocs" : [
        {
            "current" : 17.5,
            "time_minutes" : 125
        },
        {
            "current" : 17.5,
            "time_minutes" : 123
        },
        {
            "current" : 17.5,
            "time_minutes" : 126
        },
        {
            "current" : 17.5,
            "time_minutes" : 124
        }
    ]
}
{
    "_id" : ObjectId("5e8453c095c85ca0c33a9461"),
    "sum_current" : 77.38,
    "switchInfo" : {
        "_id" : ObjectId("5e8453c095c85ca0c33a9461"),
        "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"),
        "relay" : 1,
        "name" : "Lampu Tengah",
        "voltage" : 80,
        "duration" : null,
        "status" : true,
        "triggered_by" : ObjectId("5e5fd642fce106005319e884"),
        "created_at" : ISODate("2020-04-01T15:41:36.588Z"),
        "updated_at" : ISODate("2020-04-01T22:59:39.261Z")
    },
    "powerUsageDocs" : [
        {
            "current" : 19.345,
            "time_minutes" : 124
        },
        {
            "current" : 19.345,
            "time_minutes" : 126
        },
        {
            "current" : 19.345,
            "time_minutes" : 123
        },
        {
            "current" : 19.345,
            "time_minutes" : 125
        }
    ]
}

Update

If you just need info about your switch, also you need to get the watt which is = total current * voltage of each switch, we can do that in the $project, we can add the $multiply operator to the $project pipeline, which multiplies the voltage of the switch by the total current we just calculated in the $group pipeline

db.powerUsageMonth.aggregate(
    [
        {
            $match: {}
        },
        {
            $lookup: {
                from: 'switches',
                localField: 'switch_id',
                foreignField: '_id',
                as: 'switch'
            }
        },
        {
            $unwind: '$switch'
        },
        {
            $group: {
                _id: '$switch._id',
                switch_id: { $first: '$switch._id' },
                device_id: { $first: '$switch.device_id' },
                voltage: { $first: '$switch.voltage' },
                sum_current: {
                    $sum: '$current'
                }
            }
        },
        {
            $project: {
                _id: 1,
                switch_id: 1,
                device_id: 1,
                voltage: 1,
                sum_current: 1,
                watt: { $multiply: [ "$voltage", "$sum_current" ] }
            }
        }
    ]
)

这将产生一个形式为

的数组
{
    "_id" : ObjectId("5e8454bc95c85ca0c33a9463"),
    "switch_id" : ObjectId("5e8454bc95c85ca0c33a9463"),
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"),
    "voltage" : 100,
    "sum_current" : 70,
    "watt" : 7000
}
{
    "_id" : ObjectId("5e8453c095c85ca0c33a9461"),
    "switch_id" : ObjectId("5e8453c095c85ca0c33a9461"),
    "device_id" : ObjectId("5e7d83efd62c242a11e3ca5e"),
    "voltage" : 80,
    "sum_current" : 77.38,
    "watt" : 6190.4
}