我有一个使用express和mongoose的node.js服务器,我还有一个Json结构:
[
{
"_id": "63dbaf5daabee478202ae59f",
"experimentId": "85a91abe-ef2f-416f-aa13-ec1bdf5d9766",
"experimentData": [
{
"scanId": 1652890241,
"scanData": [
{
"areaName": "A1",
"areaData": [],
"_id": "63dbaf94aabee478202ae5a5"
},
...
],
"_id": "63dbaf6caabee478202ae5a3"
},
...
],
"__v": 2
},
...
]
如何创建查询以从scanData数组返回单个对象,例如
{
"areaName": "A1",
"areaData": [],
"_id": "63dbb006e322869df811eea4"
}
我能做的最好的事是:
// * Get all shapes in a well/area
// ! uses the experiment id, scan id and areaName
router.get("/:id/scan/:scanId/area/:areaName", async (req, res) => {
try {
const experiment = await Experiment.findOne({
experimentId: req.params.id,
experimentData: {
$elemMatch: {
scanId: req.params.scanId,
scanData: {
$elemMatch: {
areaName: req.params.areaName
}
}
}
}
}, {'experimentData.scanData.$': 1})
console.log(experiment)
if (!experiment || experiment.length === 0) res.status(404).json({})
else {
res.send(experiment.experimentData[0])
}
} catch (err) {
res.status(500).json({ message: err.message })
}
})
但这只是返回了scanData数组,如果我能再深入一层,只获取具有areaName的对象,那就太好了。我还尝试了一些使用$aggregate的解决方案,但无法显示任何数据,因为它一直返回空数组
1条答案
按热度按时间bqf10yzr1#
您可以按您的条件逐层执行
$match
,并使用$unwind
获取聚合管道中的最终scanData
对象。使用$replaceRoot
仅获取scanData
对象。Mongo Playground