MongoDB按ID在嵌套数组中查找

时间:2019-10-30 05:28:10

标签: node.js mongodb mongoose

我的模型称为住宅

{
    "_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
        }}
    ])
}

3 个答案:

答案 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()