Node.js 在mongoDB中,如何根据细节数组中特定对象的值对文档进行排序?

Node.js 在mongoDB中,如何根据细节数组中特定对象的值对文档进行排序?,node.js,angular,mongodb,Node.js,Angular,Mongodb,以下是mongodb中的数据表示: { "_id": { "$oid": "60754054fa887e14c4569a94" }, "details": [{ "label": "Asset title", "type": "text", &quo

以下是mongodb中的数据表示:

 {
    "_id": {
        "$oid": "60754054fa887e14c4569a94"
    },
    "details": [{
        "label": "Asset title",
        "type": "text",
        "id": "text-1617189723969",
        "value": "S1",
        "rawValue": "S1"
    }, {
        "label": "Total Cost",
        "type": "number",
        "id": "number-1618296818377",
        "value": "1500",
        "rawValue": "1500"
    }, {
        "label": "Possession Status",
        "type": "radio",
        "id": "radio-1617189728809",
        "value": "Available",
        "rawValue": "available"
    }, {
        "label": "Estimated Monthly Rent",
        "type": "number",
        "id": "number-1617189737553",
        "value": "200",
        "rawValue": "200"
    }],
    "status": "Approved",
    "createdAt": {
        "$date": "2021-04-13T06:55:16.843Z"
    },
    "__v": 0
},
{
    "_id": {
        "$oid": "60756c279cdd25019c6c3707"
    },
    "details": [{
        "label": "Asset title",
        "type": "text",
        "id": "text-1617189723969",
        "value": "S2",
        "rawValue": "S2"
    }, {
        "label": "Total Cost",
        "type": "number",
        "id": "number-1618296818377",
        "value": "280",
        "rawValue": "280"
    }, {
        "label": "Possession Status",
        "type": "radio",
        "id": "radio-1617189728809",
        "value": "Available",
        "rawValue": "available"
    }, {
        "label": "Estimated Monthly Rent",
        "type": "number",
        "id": "number-1617189737553",
        "value": "500",
        "rawValue": "500"
    }],
    "status": "Approved",
    "createdAt": {
        "$date": "2021-04-13T10:02:15.701Z"
    },
    "__v": 0
},
{
    "_id": {
        "$oid": "60756d33af10052394f24e5c"
    },
    "details": [{
        "label": "Asset title",
        "type": "text",
        "id": "text-1617189723969",
        "value": "S3",
        "rawValue": "S3"
    }, {
        "label": "Total Cost",
        "type": "number",
        "id": "number-1618296818377",
        "value": "100",
        "rawValue": "100"
    }, {
        "label": "Possession Status",
        "type": "radio",
        "id": "radio-1617189728809",
        "value": "Available",
        "rawValue": "available"
    }, {
        "label": "Estimated Monthly Rent",
        "type": "number",
        "id": "number-1617189737553",
        "value": "300",
        "rawValue": "300"
    }],
    "status": "Approved",
    "createdAt": {
        "$date": "2021-04-13T10:06:43.560Z"
    },
    "__v": 0
}
例如:我尝试对文档进行排序,其中我必须从标签为“Total Cost”的details数组中选择该对象的值,并根据“Total Cost”值应用排序

我的代码实现:

assetCtrl.getApprovedAsset = async (req, res) => {
            try {
                let { sorting, sortingtype } = req.query;
                let perPage = Number(req.query.perpage ? req.query.perpage : 0);
                let page = Number(req.query.page ? req.query.page : 0);
                if (typeof perPage !== 'undefined' && perPage !== '' && perPage > 0 &&
                    typeof page !== 'undefined' && page !== '' && page > 0) {
                    let skippage = (perPage * page) - perPage;
                    let filter = {
                        status: "Approved",
                    }
        
                    let sortObj = {}
                    let sorttype = (sortingtype === 'asc') ? 1 : -1;
                    if (sorting !== '') {
                        switch (sorting) {
                            case 'cost' :
                                sortObj.details.value = sorttype;
                                break;
                            case 'monthly_rent' :
                                sortObj.details.value = sorttype;
                                break;
                            case 'createdAt':
                                sortObj.createdAt = sorttype;
                                break;
                        }
                    } else {
                        sortObj.details.value = 1;
                    }
                    AddAssets.aggregate([
                        {
                            "$project": {
                                createdAt: 1,
                                userid: 1,
                                details: 1,
                                status: 1
                            }
                        },
                        {
                            "$match": filter
                        },
                        // {
                        //     "$match": {
                        //         details: {
                        //             "$elemMatch": {
                        //                 label: "Total Cost"
                        //             }
                        //         }
                        //     }
                        // },
                    // ]).sort({ "details.value": 1 }).skip(skippage).limit(perPage)    
                    ]).sort({ sortObj}).skip(skippage).limit(perPage)
                        .exec((err, assetList) => {
                            if (err) {
                                res.status(400).json({ status: false, message: err.message })
                            } else {
                                res.status(200).json({
                                    status: true,
                                    message: "success",
                                    assetList: assetList,
                                    current: page,
                                })
                            }
                        })
                }
            } catch (error) {
                res.status(500).json({ status: false, message: "Internal Server Error" })
            }
 }

注意:我还尝试排除sortObj并实现了注释代码。

使用$set with将数组减少为包含total cost字段的单个文档,然后在此字段上使用$sort。

是否可以添加预期的输出,并通过查询链接到。