mongoose中查询子文档的子文档

Posted

技术标签:

【中文标题】mongoose中查询子文档的子文档【英文标题】:Querying a sub document of a sub document in mongoose 【发布时间】:2020-07-16 05:44:05 【问题描述】:

在我的父母内部,我有很多孩子,其中一个孩子也有很多子孩子,我需要返回特定孩子的子孩子。

exports.test = (req, res) => 
    Forum.find(title: req.params.id).then(record => 
        console.log(record);
    )
;

当我插入正确的新闻和公告 url 参数时,这里的代码返回以下内容:

_id: 5e7bf52ebb5b2b09fb46e29f,
title: 'News & Announcements',
property: 'ACP',
position: 1,
visible: true,
topics: [ [Object], [Object], [Object] ],
__v: 5  ]

然后我想访问主题并返回一个特定主题 - 如上所述通过名称/标题找到它,我该怎么做?

【问题讨论】:

【参考方案1】:

如果这个主题字段是一个对象数组并且每个对象都包含名称和标题,那么您可以搜索您想要的主题,只需将其添加到您传递给查找查询的对象中

例如,如果您需要查询一些名为“我的主题”的主题,那么查询应该是

Forum.find( title: req.params.id, 'topics.name': 'My Topic' )

这会缩小查询结果的范围,但如果同一论坛中还有其他名称不同的主题,它们将在查询中与您一起出现

例如,如果某个论坛有以下信息:


    _id: ObjectId("5e7bf52ebb5b2b09fb46e29f"),
    title: 'News & Announcements',
    property: 'ACP',
    position: 1,
    visible: true,
    topics: [
        
            name: 'Topic 1',
            title: 'Title 1'
        , 
            name: 'Topic 2',
            title: 'Title 2'
        , 
            name: 'My Topic',
            title: 'My Title'
        
    ],

如果您只在本论坛中搜索主题“我的主题”,则查询将返回所有主题数组,因为搜索是按文档完成的

所以你必须在完成查询后做一些 javascript 技巧来只获取具有你想要的名称的主题

var myTopic = record.ropics.filter(topic => topic.name === 'My Topic' 

这将只返回您想要的主题

【讨论】:

以上是关于mongoose中查询子文档的子文档的主要内容,如果未能解决你的问题,请参考以下文章

查询子文档并从中选择过滤后的数据 Mongoose

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

Mongoose 删除数组中的子文档

使用 Mongoose 更新数组中的子文档

Mongoose 中的子文档数组

NodeJS - 我们可以从 Mongoose 更新填充的子文档吗?