如何匹配MongoDB中的子文档数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何匹配MongoDB中的子文档数组?相关的知识,希望对你有一定的参考价值。

仅当同一文档包含等于某个值的字段时,如果子文档数组中的值大于某个值,则匹配文档

我有一个包含一系列子文档的文档的集合。该子文档数组包含一个字段,该字段指示我是否可以基于子文档中的另一个字段过滤集合中的文档。当您看到该文档的示例时,这会更有意义。

    {  
    "_id":"ObjectId('XXX')",
    "Data":{  
        "A":"",
        "B":"-25.78562 ; 28.35629",
        "C":"165"
    },
    "SubDocuments":[  
        {  
            "_id":"ObjectId('XXX')",
            "Data":{  
                "Value":"XXX",
                "DataFieldId":"B"
            }
        },
        {  
            "_id":"ObjectId('XXX')",
            "Data":{  
                "Value":"",
                "DataFieldId":"A"
            }
        },
        {  
            "_id":"ObjectId('XXX')",
            "Data":{  
                "Value":"105",
                "DataFieldId":"Z"
            }
        }
    ]
}

我只希望将包含子文档的文档与DataFieldId匹配,该DataFieldId等于Z,但只有在Data Field Id等于Z时才过滤大于105的值。

答案

请尝试以下方式:

db.collection.aggregate([
{
    $project: {
        _id:1,
        Data:1,
        filteredSubDocuments: {
            $filter: {
                input: "$SubDocuments",
                as: "subDoc",
                cond: { 
                    $and: [
                        { $eq: ["$$subDoc.Data.DataFieldId", "Z"] },
                        { $gte: ["$$subDoc.Data.Value", 105] }
                    ]
                }
            }
        }
    }
}
])

结果回复将是:

{
    "_id" : ObjectId("5cb09659952e3a179190d998"),
    "Data" : {
        "A" : "",
        "B" : "-25.78562 ; 28.35629",
        "C" : "165"
    },
    "filteredSubDocuments" : [
        {
            "_id" : "ObjectId('XXX')",
            "Data" : {
                "Value" : 105,
                "DataFieldId" : "Z"
            }
        }
    ]
}
另一答案

这可以通过在子文档上使用$elemMatch运算符来完成,有关详细信息,您可以单击提供的链接。对于您的问题,您可以使用$elemMatch尝试以下查询, db.collectionName.find({ "SubDocuments": { $elemMatch: { "Data.DataFieldId": "Z" , "Data.Value" : {$gte: 105} } } }) 比聚合更简单:

SubDocuments.Data.Value

它工作正常,我已在本地验证,你需要的一个修改是你必须根据你的要求将Number的值作为Long或qazxswpoi。

以上是关于如何匹配MongoDB中的子文档数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mongo DB 中的子文档数组中删除匹配条件的子文档

如何使用 C# 驱动程序更新 MongoDB 数组中的子文档

如何使用python脚本从mongoDB中检索数组中的子文档

如何使用python脚本从mongoDB中检索数组中的子文档

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

如何使用C#驱动程序更新MongoDB数组中的子文档