我有这样的章 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>"
}
答案 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()
希望有帮助。