Как получить только документ из массива поддокумента в mongoose - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть Глава schema, например:

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

Итак, существует массив тем в качестве поддокументов главы. Я хочу получить определенный топи c по его _id из главы. Для этого я попробовал этот запрос ниже:

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

Но он возвращает целую главу этой топи c с топи c, как этот брат:

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

I не нужна целая глава, как указано выше. Мне просто нужен один объект topi c, который я ищу по его идентификатору. Как я могу получить

Ожидаемый результат:

        {
            "_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 Ответ

1 голос
/ 23 февраля 2020

Вам нужно использовать $elemMatch при проецировании, чтобы он дал нам соответствующий массив re c ord.

что-то вроде этого должно работать

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...