如何在MongoDB中匹配一系列子文档?

时间:2019-04-12 13:17:19

标签: mongodb mongodb-query

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

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

    {  
    "_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等于Z的文档,而且仅当数据字段Id等于Z时才过滤大于105的值。

2 个答案:

答案 0 :(得分:1)

尝试如下:

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

答案 1 :(得分:0)

这可以通过在子文档上使用$elemMatch运算符来完成,有关详细信息,您可以单击提供的链接。对于您的问题,您可以使用比聚合更简单的$elemMatch来尝试以下查询:

    db.collectionName.find({
    "SubDocuments": { 
        $elemMatch: {
            "Data.DataFieldId": "Z" , 
            "Data.Value" : {$gte: 105}  
        } 
    } })

它工作正常,我已经在本地进行了验证,您需要进行的一项修改是,您必须根据需要将SubDocuments.Data.Value的值设置为NumberLong