Группировка и подсчет операций в MongoDB - PullRequest
1 голос
/ 28 марта 2020

У меня есть две коллекции, которые выглядят следующим образом

Ticket_master

{
    "_id" : ObjectId("5e70ed53de0f7507d4da8dc2"),
    "TICKET_NO" : 1000,
    "DESCRIPTION" : "<p>dsdsd</p>",
    "ASSIGNED_TO" : ObjectId("5e78f2b2c0e09128e81db475"),
    "RESOLVED_BY" : ObjectId("5e6f1c5b8451307f782d0992")
}

/* 2 */
{
    "_id" : ObjectId("5e70f19c47df9479502f7933"),
    "TICKET_NO" : 1001,
    "DESCRIPTION" : "<p>vcvcv</p>",
    "ASSIGNED_TO" : ObjectId("5e706e914587054254c02085"),
    "RESOLVED_BY" : ObjectId("5e6f1c5b8451307f782d0992")
}

/* 3 */
{
    "_id" : ObjectId("5e70f4fa47df9479502f7937"),
    "TICKET_NO" : 1002,
    "DESCRIPTION" : "<p>xcxc</p>",
    "ASSIGNED_TO" : ObjectId("5e706e914587054254c02085"),
    "RESOLVED_BY" : ObjectId("5e706e914587054254c02085")
}

Agent_master

{
    "_id" : ObjectId("5e6f1c5b8451307f782d0992"),
    "NAME" : "A1",
}

/* 2 */
{
    "_id" : ObjectId("5e706e914587054254c02085"),
    "NAME" : "A2",
}

/* 3 */
{
    "_id" : ObjectId("5e78f2b2c0e09128e81db475"),
    "NAME" : "A3",
}

Мне нужно выполнить различные операции с базой данных, такие как группировка и подсчет для получения ожидаемого результата, который указан ниже

Ожидаемый результат:

[
    {
         NAME : 'A1',
         COUNT:2,
    },
    {
        NAME : 'A2',
        COUNT:1,
    },
    {
        NAME : 'A3',
        COUNT:0,
    }

]

Я хочу найти количество заявок, разрешенных каждым агентом с указанием имени агента. RESOLVED_BY относится к идентификатору агента, который разрешил заявку.

Надеюсь, вы понимаете, о чем я! Спасибо

Попробовал следующий запрос:

db.getCollection('ticket_masters').aggregate([
    {"$group" : {_id:"$RESOLVED_BY", count:{$sum:1}}}
    ])

Фактический результат:

/* 1 */
{
    "_id" : ObjectId("5e78f2ddc0e09128e81db47a"),
    "count" : 1.0
}

/* 2 */
{
    "_id" : ObjectId("5e6f1c5b8451307f782d0992"),
    "count" : 4.0
}

/* 3 */
{
    "_id" : null,
    "count" : 6.0
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вот ответ

db.Agent_master.aggregate([
    {
        $lookup: {
            "from": "Ticket_master",
            "localField": "_id",
            "foreignField": "RESOLVED_BY",
            "as": "tickets"
        }
    },
    {
        $project:  {
            Name: '$Name',
            Count: { $size: '$tickets'}
        }
    }
])

Вы должны использовать $ lookup, чтобы объединить две коллекции. Так как вам нужно только считать, то это может быть сделано только $ project.

0 голосов
/ 28 марта 2020

Вы можете попробовать запрос ниже:

db.Ticket_master.aggregate([
  /** Get agents info who resolved tickets */
  {
    $lookup: {
      from: "Agent_master",
      localField: "RESOLVED_BY",
      foreignField: "_id",
      as: "agent_docs"
    }
  },
  /** As agent_docs is an array unwind into make it into objects */
  {
    $unwind: "$agent_docs"
  },
  /** Group on 'NAME' & count no.of occurrences of each NAME */
  {
    $group: {
      _id: "$agent_docs.NAME",
      COUNT: {
        $sum: 1
      }
    }
  },
  /** Transform fields into required format */
  {
    $project: {
      _id: 0,
      NAME: "$_id",
      COUNT: 1
    }
  }
])

Тест: MongoDB-Playground

...