计算符合条件的数组元素

Posted

技术标签:

【中文标题】计算符合条件的数组元素【英文标题】:Count array elements that matches condition 【发布时间】:2019-03-05 12:35:14 【问题描述】:

我有一个名为“会议”的 mongoDB 集合,其中包含一组参与者,如下所示:

[
  
    "_id" : 5b894357a0c84d5a5d221f25, 
    "conferenceName" : "myFirstConference",
    "startDate" : 1535722327, 
    "endDate" : 1535722420,
    "participants" : [
        
            "name" : "user1", 
            "origin" : "internal", 
            "ip" : "192.168.0.2"
        ,
        
            "name" : "user2", 
            "origin" : "external", 
            "ip" : "172.20.0.3"
        , 
    ]
  ,
  ...
]

我想得到以下结果:

[
  
     "conferenceName" : "myFirstConference",
     "startDate" : 1535722327, 
     "endDate" : 1535722420,
     "internalUsersCount" : 1
     "externalUsersCount" : 1,
  ,
  ...
]

我尝试了下面的请求,但它不起作用:

db.getCollection("conference").aggregate([
   
     $addFields: 
       internalUsersCount : 
            $size :  "$participants" : $elemMatch :  origin : "internal" 
         ,
       externalUsersCount : 
            $size :  "$participants" : $elemMatch :  origin : "external" 
                  
     
   
])

如何计算匹配 "origin" : "internal""origin" : "external" 的“参与者”数组元素?

【问题讨论】:

【参考方案1】:

您需要使用$filter 聚合过滤掉external 原点和internal 原点以及$size 聚合来计算数组的长度。

类似的东西

db.collection.aggregate([
   "$addFields": 
    "internalUsersCount": 
      "$size": 
        "$filter": 
          "input": "$participants",
          "as": "part",
          "cond":  "$eq": ["$$part.origin", "internal"]
        
      
    ,
    "externalUsersCount": 
      "$size": 
        "$filter": 
          "input": "$participants",
          "as": "part",
          "cond":  "$eq": ["$$part.origin", "external"] 
        
      
    
  
])

输出

[
  
    "conferenceName": "myFirstConference",
    "endDate": 1535722420,
    "externalUsersCount": 1,
    "internalUsersCount": 1,
    "startDate": 1535722327
  
]

【讨论】:

这是对我问题的最快和最优雅的回答。非常感谢楼主

以上是关于计算符合条件的数组元素的主要内容,如果未能解决你的问题,请参考以下文章

python数组中怎样删除符合条件的元素

python数组中怎样删除符合条件的元素

算法——分治和快速排序

华为机试真题 C++ 实现计算最大乘积

华为机试真题 Java 实现计算最大乘积

华为OD机试 - 计算最大乘积(Java) | 机试题+算法思路+考点+代码解析 2023