我的模型称为住宅
{
"_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 (确定)
exports.getSpaceNameById = (spaceId) => {
return Residence.find({ 'spaces._id': spaceId }, { _id: 0, spaces: { $elemMatch: { _id: spaceId } } })
}
现在,我想获得ID请求的子空间名称。
但是我的梦想是同时拥有两个(通过subSpace 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
}}
])
}
答案 0 :(得分:0)
尝试这样的事情:
find({spaces._id:id})
答案 1 :(得分:0)
以下应为您工作。该查询将返回整个文档。
按名称:
db.collection.find({"spaces.subSpace.name": "Basement"})
通过_id:db.collection.find({"spaces.subSpace._id": "YOUR_ID"})
答案 2 :(得分: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()