node.js - MongoDB在嵌套数组中按Id查找
问题描述
我的模型叫做Residence
{
"_id": { "$oid": "5d88dfe45feb4c06a5cfb762" },
"spaces": [{
"_id": { "$oid": "5d88dfe45feb4c06a5cfb76f" },
"name": "Building 2",
"subSpace": [
{
"_id": { "$oid": "5d88dfe45feb4c06a5cfb771" },
"name": "Basement"
},
{
"_id": { "$oid": "5d88dfe45feb4c06a5cfb770" },
"name": "Floors" // Get only the name by Id
}
]
}
}
按 Id查找spaceName (OK)
exports.getSpaceNameById = (spaceId) => {
return Residence.find({ 'spaces._id': spaceId }, { _id: 0, spaces: { $elemMatch: { _id: spaceId } } })
}
现在我想要 Id 请求的子空间名称。
但我的梦想是同时拥有两者(按子空间 ID 查询,例如:5d88dfe45feb4c06a5cfb770):spaceName / subSpaceName只有 1 个请求。
谢谢你的帮助。
更新 1
我尝试这种方法,但响应是一个空数组
exports.getSubSpaceNameById = (spaceId) => {
return Residence.aggregate([
{ $match: {'spaces.subSpace._id': spaceId}},
{ $project: {
'spaces.subSpace': { $filter: {
input: '$spaces.subSpace',
as: 'mySubSpace',
cond: { $eq: ['$$mySubSpace._id', spaceId]}
}},
_id: 0
}}
])
}
解决方案
试试这个查询
db.testers.aggregate([
{
$addFields:{
"spaces":{
$map:{
"input":"$spaces",
"as":"doc",
"in":{
$mergeObjects:[
"$$doc",
{
"subSpace":{
$filter:{
"input":"$$doc.subSpace",
"as":"sn",
"cond": {
"$and": [
{ "$eq": [ "$$sn._id", "5d88dfe45feb4c06a5cfb770" ] },
]
}
}
}
}
]
}
}
}
}
}
]).pretty()
推荐阅读
- cors - Svelte API 代理服务器
- stm32 - 如何进行 USART 通信 请告诉我进行 usart 通信应注意的一切
- laravel - 如何在 Laravel 中进行身份验证并重定向到相应的域
- spring - Spring Data - 在投影中使用属性值
- android - 使用 ActionBar 的 Tablayout 的滚动行为无法正常工作
- html - 我的 HTML 网页内容比移动设备和某些 PC 上的屏幕宽
- c# - 使用安全字符串解密函数
- google-drive-api - 如何使用 Google Docs Api 复制文档?
- python - Python 桌面客户端在迭代包含 url 的 excel 数据时挂起
- scrapy - 监控 Airflow 中的长期任务