【问题标题】:Count array elements that matches condition计算符合条件的数组元素
【发布时间】:2019-02-09 13:40:37
【问题描述】:

我有一个名为“会议”的 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"} 的“参与者”数组元素?

【问题讨论】:

    标签: database mongodb mongodb-query aggregation-framework


    【解决方案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
      }
    ]
    

    【讨论】:

    • 这是对我问题的最快和最优雅的回答。非常感谢楼主
    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多