计算mongodb集合中的数组文档

时间:2015-09-16 10:16:09

标签: mongodb mongodb-query

我有这样的实体集合:

 {
        "_id" : ObjectId("55f93cedc4fd0e1f309aea64"),
        "entityType" : "1",
        "identifierIdentity" : [
                {
                        "identifierTypeCode" : "NPI",
                        "identifierValue" : "111"
                },
                {
                        "identifierTypeCode" : "NPI",
                        "identifierValue" : "123"
                },
                {
                        "identifierTypeCode" : "NPI",
                        "identifierValue" : "141"
                },
                {
                        "identifierTypeCode" : "SSN",
                        "identifierValue" : "155"
                }
        ]
}
{
        "_id" : ObjectId("55f93cedc4fd0e1f309aea65"),
        "entityType" : "2",
        "identifierIdentity" : [
                {
                        "identifierTypeCode" : "NPI",
                        "identifierValue" : "111"
                },
                {
                        "identifierTypeCode" : "NPI",
                        "identifierValue" : "123"
                },
                {
                        "identifierTypeCode" : "SSN",
                        "identifierValue" : "155"
                }
        ]
}
{
        "_id" : ObjectId("55f93cedc4fd0e1f309aea66"),
        "entityType" : "3",
        "identifierIdentity" : [
                {
                        "identifierTypeCode" : "SSN",
                        "identifierValue" : "111"
                },
                {
                        "identifierTypeCode" : "SSN",
                        "identifierValue" : "123"
                }
        ]
}

在上面的identifierIdentity是一个文档数组。

我试图让实体计数在哪里" identifierTypeCode" :" NPI"大于或等于二。

我能够使用java代码获得这个,但我有数百万条记录需要花费很多时间。我想知道他们是否可以通过单一查询实现这一目标。

1 个答案:

答案 0 :(得分:0)

$redact聚合运算符将对此进行简短的处理,并且对具有至少两个元素的数组进行匹配以减少数据:

    db.collection.aggregate([
    { "$match": {
        "identifierIdentity.identifierTypeCode": "NPI",
        "identifierIdentity.1": { "$exists": true }
    }},
    { "$redact": {
        "$cond": {
            "if": { 
                "$gte":  [ 
                    { "$size": { "$setDifference": [
                        { "$map": {
                            "input": "$identifierIdentity",
                            "as": "el",
                            "in": {
                                "$cond": {
                                    "if": { "$eq": ["$$el.identifierTypeCode", "NPI"] },
                                    "then": "$$el",
                                    "else": false
                                }
                            }
                        }},
                        [false]
                    ] } },
                    2
                ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

首先基本匹配以删除可能的文档到procces,$redact通过过滤掉数组中的匹配并计算结果的大小来执行另一个逻辑匹配。如果大于或等于2,则保留结果,或以其他方式丢弃结果。