Дубликаты MongoDB сгруппированы по владельцу - PullRequest
1 голос
/ 27 мая 2020

Я использую mon go в течение нескольких месяцев, и, помимо простых c операций запроса и агрегирования, я еще не очень хорошо знаком с агрегатами ... Я пришел с языка sql ..

У меня есть база данных, подобная этой:

    {
    ownerId: "A",
    email: "a@a.com",
    phone: "333",
    current: true,
    deleted: false
  },
  {
    ownerId: "A",
    email: "b@b.com",
    phone: "444",
    current: true,
    deleted: false
  },
  {
    ownerId: "A",
    email: "b@b.com",
    phone: "555",
    current: true,
    deleted: false
  },
  {
    ownerId: "B",
    email: "a@a.com",
    phone: "333",
    current: true,
    deleted: false
  },
  {
    ownerId: "C",
    email: "a@a.com",
    phone: "333",
    current: true,
    deleted: false
  },
  {
    ownerId: "B",
    email: "a@a.eu",
    phone: "333",
    current: true,
    deleted: false
  }

Результат, который я хотел бы получить: сгруппирован по ownerId, я хочу знать, есть ли у этого ownerId дублирующийся «адрес электронной почты» ИЛИ дубликат «phone» в адресной книге. Условие состоит в том, что ownerId X не может иметь два или более одинаковых адреса электронной почты или один и тот же телефон. Я пытаюсь разными способами, но я тоже не могу найти способ начать .. Мне нужна ваша помощь ..

https://mongoplayground.net/p/D6X4WTyAIiR

Ожидаемое вывод (basen в этом примере) выглядит примерно так:

[
  {
    ownerId : "A",
    emails: [
      "b@b.com"
    ],
    phones :[]
  }
]

Большое спасибо!

1 Ответ

1 голос
/ 28 мая 2020

Для этой агрегации используйте:

  • $ фасетный этап для работы с 2 конвейерами
    • в каждом конвейере, $ group по идентификатору владельца и электронной почте или телефону и получите количество
    • $ соответствует любому, что встречается более одного раза
  • $ project с использованием $ concatArrays для объединения выходных данных фасетов
  • $ group by ownerId, и $ pu sh дубликаты в соответствующий массив
db.collection.aggregate([
  {$facet: {
      email: [
        {$group: {
            _id: {
              owner: "$ownerId",
              email: {$ifNull:["$email","null"]}
            },
            count: {$sum: 1}
        }},
        {$match: {count: {$gt: 1}}}
      ],
      phone: [
        {$group: {
            _id: {
              owner: "$ownerId",
              phone: {$ifNull:["$phone","null"]}
            },
            count: {$sum: 1}
        }},
        {$match: {count: {$gt: 1}}}
      ]
  }},
  {$project: {
      all: {
        $concatArrays: ["$email", "$phone"]
      }
  }},
  {$unwind: "$all"},
  {$group: {
      _id: "$all._id.owner",
      emails: {$push: "$all._id.email"},
      phones: {$push: "$all._id.phone"}
  }},
  {$project:{
      _id: 0,
      onwerId: "$_id",
      emails: 1,
      phones: 1
  }}
])

Площадка

...