我有像下面这样的Mongo documents,想要执行聚合,以找到每个唯一的联系人的错误代码计数.

{
  "_id": {
    "$oid": ""
  }, 
  "campId": "61baef7817cd8ff66518", //camp1
  "contactId": "61aa6fbf77490b0007714273", // contact 1
  "title": "Happy Holidays!",
  "communicationType": "EMAIL", 
  "contactedOnTime": {
    "$numberLong": "1695182032" // AT TIME1
  },  
  "communicationValidationError": "EMAIL_ADDRESS_NOT_PRESENT"
}

{
    "_id": {
        "$oid": ""
    },
    "campId": "61baef7817cd8ff66518", //camp1
    "contactId": "61aa6fbf77490b0007714273", // contact1
    "title": "Happy Holidays!",
    "communicationType": "EMAIL",  
    "contactedOnTime": {
        "$numberLong": "1695182074" // AT TIME2 
    },
    "communicationValidationError": "EMAIL_ADDRESS_NOT_PRESENT"
}
{
    "_id": {
        "$oid": ""
    },
    "campId": "61baef7817cd8ff66518", // camp1
    "contactId": "61aa6fbf77490b0007714274", // contact2
    "title": "Happy Holidays!",
    "communicationType": "EMAIL",
    "contactedOnTime": {
        "$numberLong": "1695182059" 
    },
    "communicationValidationError": "EMAIL_BOUNCED"
}

我在下面试过了,但是这并不能消除Camp的重复联系人,并且显示为2而不是1.我需要为唯一的联系人 Select 最新的Communication ValidationError,并将其作为campID的Communication ValidationError的totalcounts%.

db.myCollection.aggregate([
    { $project: { _id: 0, campId: 1, contactId: 1, communicationValidationError: 1 } },
    { $sort: { "contactedOnTime.numberLong":-1}},
    { $match: { campId: '61baef7817cd8ff66518' } },
    { $group: { _id: { communicationValidationError: '$communicationValidationError' }, totalErrors: { $sum: 1 } } }
]).pretty()

推荐答案

要点:

Pick latest 100 for unique contacts and get it as 101 of 100 of a campId.

因此,查询应为:

  1. $match

  2. $setWindowFields-添加新字段rankInLatest.这将按contactId对文档进行分组,并按contactedOnTime降序排列.

  3. $match个 - Filter the document with rankInLatest: 1. This will return each document of contactId with the latest contactedOnTime.

  4. $group-按communicationValidationError分组并执行计数.

db.collection.aggregate([
  {
    $match: {
      campId: "61baef7817cd8ff66518"
    }
  },
  {
    $setWindowFields: {
      partitionBy: "$contactId",
      sortBy: {
        contactedOnTime: -1
      },
      output: {
        rankInLatest: {
          $rank: {}
        }
      }
    }
  },
  {
    $match: {
      rankInLatest: 1
    }
  },
  {
    $group: {
      _id: {
        communicationValidationError: "$communicationValidationError"
      },
      totalErrors: {
        $sum: 1
      }
    }
  }
])

Demo @ Mongo Playground

Mongodb相关问答推荐

在MongoDB中使用explain()和查询时缺少winningPlan''''

MongoDB:删除键上有条件的对象元素

MongoDB - 将数组元素转换为新字段

避免在 MongoDB 聚合框架中使用 ISODate() 以便管道可以是纯 JSON

从 MongoDB 中的聚合结果中获取不同的值

分页时根据唯一字段mongodb获取数据

MongoDB 使用 pymongo 收集 500K 文档的写入速度很差

Meteor 和 Fibers/bindEnvironment() 是怎么回事?

使用 AngularJs 和 MongoDB/Mongoose

Mongo 无法启动

为什么mongodb的文档中存储键名

在mongo聚合中将ObjectID转换为字符串

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

将MongoDB连接到前端?

如何使用sailsjs v0.10连接mongodb?

MongoDB展开多个数组

MongoDB:自动生成的 ID 为零

如何在 mongoDB 中聚合巨大的数组?

直接从 URL 查询字符串提供的 mongo 查询有多危险?

docker 在不同的端口上运行 mongo 映像