Node.js 在mongoDB中,如何根据细节数组中特定对象的值对文档进行排序?
以下是mongodb中的数据表示:Node.js 在mongoDB中,如何根据细节数组中特定对象的值对文档进行排序?,node.js,angular,mongodb,Node.js,Angular,Mongodb,以下是mongodb中的数据表示: { "_id": { "$oid": "60754054fa887e14c4569a94" }, "details": [{ "label": "Asset title", "type": "text", &quo
{
"_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。是否可以添加预期的输出,并通过查询链接到。