我有这样的实体集合:
{
"_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代码获得这个,但我有数百万条记录需要花费很多时间。我想知道他们是否可以通过单一查询实现这一目标。
答案 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,则保留结果,或以其他方式丢弃结果。