如何从猫鼬子文档数组中仅获取文档

时间:2020-02-23 19:35:25

标签: node.js mongodb express mongoose

我有这样的 schema

const ChapterSchema = new Schema({
    title: {
        type: String,
        required: [true, 'Chapter title is required']
    },
    topics: { type: [TopicSchema] }
})

因此,有一个主题数组作为Chapter的子文档。 我想通过章节_id中的特定主题。为此,我尝试了以下查询:

let data = await Chapter.findOne({ "topics._id": _id })
return res.json(data)

但是它返回了本主题的整章内容,如下所示:

{
    "_id": "5e504271ee36f61ba8d76f37",
    "title": "Roshayon Chapter 2",
    "topics": [
        {
            "_id": "5e52bdf994b60b4c540cab33",
            "title": "topic 4",
            "intro": "<p><b>This text is bold</b></p><p><i>This text is italic</i></p><p>This is<sub> subscript</sub> and <sup>superscript</sup></p>"
        },
        {
            "_id": "5e52bdf994b60b4c540cab34",
            "title": "topic 5",
            "intro": "<p><b>This text is bold</b></p><p><i>This text is italic</i></p><p>This is<sub> subscript</sub> and <sup>superscript</sup></p>"
        }
    ]
}

我不需要上面的整个章节。我只需要一个按其ID查找的主题对象。 我怎么能得到

预期结果:

        {
            "_id": "5e52bdf994b60b4c540cab34",
            "title": "topic 5",
            "intro": "<p><b>This text is bold</b></p><p><i>This text is italic</i></p><p>This is<sub> subscript</sub> and <sup>superscript</sup></p>"
        }

1 个答案:

答案 0 :(得分:1)

投影时需要使用$elemMatch,以便为我们提供匹配的数组记录。

类似的东西应该起作用

let data = await Chapter.findOne({ "topics._id": _id }, {_id: 0, topics: {$elemMatch: {_id: _id}}});

如果需要获取正义对象,则可以使用聚合并使用以下查询

await Chapter.aggregate([
    {$match: {'topics._id': "5e52bdf994b60b4c540cab33"}},
    {$project: {
        topics: {$filter: {
            input: '$topics',
            as: 'topic',
            cond: {$eq: ['$$topic._id', '5e52bdf994b60b4c540cab33']}
        }},
        _id: 0
    }}
]).unwind("topics").exec()

希望有帮助。