Vyčnívající ploché hodnoty z vnořené objekty

hlasů
0

Píšu malou agregaci v mongoose filtrovat hodnoty z db a vrátit je v pořadí podle frekvence se vyskytují. Například: Řekněme, že více dokumentů mají partneři pole jako pole, které je pole objektů, z nichž každá má dvě hodnoty „partner_id“ a „passed_tests“. Chci se vrátit všechny jedinečné partnery ze všech dokumentů seřazených podle jejich četnosti v kolekci v sestupném pořadí.

Zde je příklad dokumentu:

{
    location: eindhoven,
    partners: [
        {
            partner_id: 3,
            passed_tests: true
        },
        {
            partner_id: 2,
            passed_tests: false
        }
    ],
    _id: 3136323031333066306d4438,
    uid: d95f2e446c052514c097e6c925408774,
    __v: 0,
    is_approved: true
}

Můj kód je následující:

function returnAll(callback) {
    TestService.aggregate([
        {
            $match: { is_approved: true }
        },
        {
            $unwind: $partners
        }, {
            $group: {
                _id: {
                    partner: { $objectToArray: $partners },
                    partner_id: { $arrayElemAt: [$partner, 0] }
                },
                count: { $sum: 1 }
            }
        },
        {
            $sort: { count: -1 }
        },
        {
            $project: {
                partner_values: {
                    $map: {
                        input: $_id.partner,
                        as: el,
                        in: {
                            $cond: {
                                if: {
                                    $or: [{ $eq: [$$el.v, true] },
                                    { $eq: [$$el.v, false] }]
                                }, then: {
                                    passed_tests: $$el.v
                                }, else: {
                                    id: $$el.v
                                }
                            }
                        }
                    }
                },
                count: $count,
                _id: 0
            }
        },
    ], function (error, data) {
        if (error) {
            logger.error(error);
            callback(null);
        } else {
            callback(data);
        }
    });
}

Který se vrací tento JSON do mého uzlu aplikace:

data: [
        {
            partner_values: [
                {
                    id: 2
                },
                {
                    passed_tests: false
                }
            ],
            count: 3
        },
        {
            partner_values: [
                {
                    id: 6
                },
                {
                    passed_tests: true
                }
            ],
            count: 1
        },
        {
            partner_values: [
                {
                    id: 3
                },
                {
                    passed_tests: true
                }
            ],
            count: 1
        },
        {
            partner_values: [
                {
                    id: 1
                },
                {
                    passed_tests: true
                }
            ],
            count: 1
        }
    ]

Pokud nemám používat projekční potrubí ve svém souhrnu, já si to:

data: [
        {
            _id: {
                partner: [
                    {
                        k: partner_id,
                        v: 2
                    },
                    {
                        k: passed_tests,
                        v: false
                    }
                ],
                partner_id: null
            },
            count: 3
        },
        {
            _id: {
                partner: [
                    {
                        k: partner_id,
                        v: 6
                    },
                    {
                        k: passed_tests,
                        v: true
                    }
                ],
                partner_id: null
            },
            count: 1
        },
        {
            _id: {
                partner: [
                    {
                        k: partner_id,
                        v: 3
                    },
                    {
                        k: passed_tests,
                        v: true
                    }
                ],
                partner_id: null
            },
            count: 1
        },
        {
            _id: {
                partner: [
                    {
                        k: partner_id,
                        v: 1
                    },
                    {
                        k: passed_tests,
                        v: true
                    }
                ],
                partner_id: null
            },
            count: 1
        }
    ]

což je docela pochopitelné, protože jsem se zavádějí „_id“ a další pole navíc se podívat do pole a najít hodnotu. Nicméně výstup chci, je:

data: {
            partners: [{
                id: 2,
                passed_tests: false,
                count: 3
            }, {
                id: 6,
                passed_tests: false,
                count: 1
            }, {
                id: 3,
                passed_tests: false,
                count: 1
            }, {
                id: 1,
                passed_tests: false,
                count: 1
            }]
        }

Mohu získat pomoc na to, prosím? Dík.

Položena 20/10/2018 v 12:58
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Můžete použít níže agregační dotaz.

TestService.aggregate([
  {"$match":{"is_approved":true}},
  {"$unwind":"$partners"},
  {"$group":{
    "_id":{"partner_id":"$partners.partner_id","passed_tests":"$partners.passed_tests"},
    "count":{"$sum":1}
  }},
  {"$sort":{"count":-1}},
  {"$group":{
    "_id":null,
    "partners":{"$push":{"id":"$_id.partner_id","passed_tests":"$_id.passed_tests","count":"$count"}}
  }},
  {"$project":{"partners":1}}
])
Odpovězeno 20/10/2018 v 13:44
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more