$グループの後に示されていない$プロジェクト$ルックアップ値

ヴィッキースルタン:

私は私がやりたい2関連のコレクションを持っています$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")
}

今私は、ルックアップ$を使用してこれらのコレクションに「参加」としたい$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

}
モハメドYousry:

あなたは、グループ化した後、最後のステップとして、プロジェクトを行うことができますし、$lookupまた、あなたは、グループ内のすべてのことを処理することができ、あなたが含まれていますどのような$groupクエリであなたとだけ利用できるようになりますが、あなたが収集する必要が言うことができますpower_usages_monthが使用するドキュメントを各そのスイッチ内の1つの配列内のスイッチが、あなたはそれからすべての情報を必要としないpower_usages_monthあなただけの必要、current及びtime_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,
            }
        }
    ]
)

これは彼らの総電流とスイッチ情報(あなたはすべてのスイッチ情報を必要としない場合は、あまりにもここにいくつかの投影を行うことができます)と、スイッチの配列を返します、そして電源は(投影後)このスイッチに関連するドキュメントを建物内の企業

結果はそのような何かになります

{
    "_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
        }
    ]
}

更新

あなたは自分のスイッチに関する情報を必要とする場合、また、あなたは=は、各スイッチの現在の*電圧を合計であるワットを取得する必要があり、我々はそれを行うことができ$project、我々は、追加することができます$multiplyにオペレータを$projectパイプライン、その乗算スイッチの電圧総電流によって、私たちはただで計算$groupパイプライン

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
}

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=406989&siteId=1