编写一个mongo查询来计算数组中相似数据的数据?

如何解决编写一个mongo查询来计算数组中相似数据的数据?

样本数据:有多个相似的集合:


{
    "_id" : NumberLong(301),"telecom" : [ 
        {
            "countryCode" : {
                "value" : "+1"
            },"extension" : [ 
                {
                    "url" : "primary","value" : [ 
                        "true"
                    ]
                }
            ],"modifiedValue" : {
                "value" : "8887778888"
            },"system" : {
                "value" : "phone"
            },"useCode" : {
                "value" : "Home Phone"
            },"value" : {
                "value" : "8887778888"
            }
        },{
            "extension" : [ 
                {
                    "url" : "primary","modifiedValue" : {
                "value" : "abc@test.com"
            },"system" : {
                "value" : "email"
            },"useCode" : {
                "value" : "work"
            },"value" : {
                "value" : "abc@test.com"
            }
        }
    ]
}

问题:我想继续电子邮件部分对象中不存在 telecom.system.value = emailcountryCode 的集合。在这里我附上了一个脚本,但我需要一行查询

var count = 0,i;
  db.getCollection('practitioner').find({"telecom.system.value":"email"}).forEach(function(practitioner){
    //print("updating : " +practitioner._id.valueOf())
    telecom = practitioner.telecom.valueOf()
    for(i= 0;i<telecom.length;i++){
        if(telecom[i].system.value === 'email' && telecom[i].countryCode){
        count+=1;
             }
    }
  });
  
    print(" Total count of the practitioner with country code in email object: "+count)

如上所述,脚本运行良好,输出符合我的预期。但脚本没有优化,我想用单行查询编写。提前致谢。

解决方法

您可以尝试聚合方法aggregate()

方法 1:

  • $match 条件 countryCode 应存在且 system.value 应为 email
  • $filter 迭代 telecom 数组的循环并检查两个条件,这将返回预期的元素
  • $size 从上面的过滤结果中获取总元素
  • $group 按 null 和计数总计
var result = await db.getCollection('practitioner').aggregate([
  {
    $match: {
      telecom: {
        $elemMatch: {
          countryCode: { $exists: true },"system.value": "email"
        }
      }
    }
  },{
    $project: {
      count: {
        $size: {
          $filter: {
            input: "$telecom",cond: {
              $and: [
                { $ne: [{ $type: "$$this.countryCode" },"missing"] },{ $eq: ["$$this.system.value","email"] }
              ]
            }
          }
        }
      }
    }
  },{
    $group: {
      _id: null,count: { $sum: "$count" }
    }
  }
]);

print("Total count of the practitioner with country code in email object: "+result[0].count);

Playground


方法 2:

  • $match 条件 countryCode 应存在且 system.value 应为 email
  • $unwind 解构 telecom 数组
  • $match 使用上述条件过滤文档
  • $count 获取元素总数
var result = await db.getCollection('practitioner').aggregate([
  {
    $match: {
      telecom: {
        $elemMatch: {
          countryCode: { $exists: true },{ $unwind: "$telecom" },{
    $match: {
      "telecom.countryCode": { $exists: true },"telecom.system.value": "email"
    }
  },{ $count: "count" }
]);

print("Total count of the practitioner with country code in email object: "+result[0].count);

Playground

我没有测试性能,但您可以根据您的要求检查和使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?