根据父项中的值按 Id 查找子文档

Posted

技术标签:

【中文标题】根据父项中的值按 Id 查找子文档【英文标题】:Find Subdocument by Id based on value in parent 【发布时间】:2016-12-25 19:42:12 【问题描述】:

鉴于我有以下结构的文档:


    selectedId: ObjectId("57b5fb2d7b41dde99009bc75"),
    children: [
        _id: ObjectId("57b5fb2d7b41dde99009bc75"), val: 10,
        _id: ObjectId("57b5fb2d7b41dde99009bc75"), val: 20,
    ]

父值“selectedId”总是引用其中一个子 ID,我如何才能获取 _id = selectedId 的子子文档?

我尝试过:

parentModel.findOne('selectedId': 'this.children._id')

然而,据我所知,第二个字符串被视为文字。那么如何在查询中引用父级的字段呢?

编辑:显然,这可以通过两个查询来完成,获取父级的“selectedId”值,然后再次查询。但是,我想在单个查询中执行此操作。

【问题讨论】:

【参考方案1】:

您可以使用聚合框架,特别是利用 $arrayElemAt$filter 运算符来返回子子文档。以下示例显示了这一点:

parentModel.aggregate([
    
        "$project": 
            "children": 
                "$arrayElemAt": [
                    
                        "$filter": 
                            "input": "$children",
                            "as": "item",
                            "cond": 
                                "$eq": ["$$item._id", "$selectedId"]
                            
                        
                    , 0
                ]
            
        
    
]).exec(callback);

【讨论】:

以上是关于根据父项中的值按 Id 查找子文档的主要内容,如果未能解决你的问题,请参考以下文章

查找并替换xml文档中父项中子项的重新匹配匹配项

根据列中的值按列动态排序

使用 Composition API 在 Vue 中处理子项和父项中的提交事件

R:根据上/下行中的值按组识别行

使用 PL/SQL 根据 Oracle SQL 中的父项更新子计数器

用于从 LastOrDefault 父项中查找子项的实体框架 LINQ