hunk3r
@hunk3r

Как найти дубли строк в MongoDB?

Привет!
Имеется документ в mongodb вида:

"_id" : ObjectId("5ea3138daee55c0001eac29f"),
"linkRole" : [
        {
            "role" : "admin",
            "Organization" : "a32cc286-256b-40e5-fc5d-5ecbdc341ab1"
        },
        {
            "role" : "superadmin",
            "Organization" : "a32cc286-256b-40e5-fc5d-5ecbdc341ab1"
        },
        {
            "role" : "user",
            "Organization" : "a32cc286-256b-40e5-fc5d-5ecbdc341ab1"
        },
        {
            "role" : "user",
            "Organization" : "a32cc286-256b-40e5-fc5d-5ecbdc341ab1"
        },
        {
            "role" : "admin",
            "Organization" : "dd79f23d-2382-4eb7-a2f3-634890eba0bb"
        },
        {
            "role" : "superadmin",
            "Organization" : "dd79f23d-2382-4eb7-a2f3-634890eba0bb"
        }]


Или он же в ином виде:

linkRole[0].role:admin
linkRole[0].Organization:a32cc286-256b-40e5-fc5d-5ecbdc341ab1
linkRole[1].role:superadmin
linkRole[1].Organization:a32cc286-256b-40e5-fc5d-5ecbdc341ab1
linkRole[2].role:user
linkRole[2].Organization:a32cc286-256b-40e5-fc5d-5ecbdc341ab1
linkRole[3].role:user
linkRole[3].Organization:a32cc286-256b-40e5-fc5d-5ecbdc341ab1
linkRole[4].role:admin
linkRole[4].Organization:dd79f23d-2382-4eb7-a2f3-634890eba0bb
linkRole[5].role:superadmin
linkRole[5].Organization:dd79f23d-2382-4eb7-a2f3-634890eba0bb


Вопрос: как посчитать все документы, в которых есть одинаковые "парные" массивы (в данном примере это [2] и [3]) и затем удалить все дубли?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
На ум походит только агрегация с $unwind, но $unwind догорая операция

pipeline = [
  {$unwind: "$linkRole"},
  {$group: {
    _id: {
      d_id: "$_id",
      role: "$linkRole.role",
      Organization: "$linkRole.Organization"
    },
    count: {$sum: 1}
  }},
  {$match:{count: {$gt: 1}}}
]
db.users.aggregate(pipeline).forEach(a => {
  user = db.users.findOne({_id: a._id.d_id});
  for (let i = 1; i < a.count; i++) {
    user.linkRole.splice(
      user.linkRole.findIndex(lr => lr.role === a._id.role && lr.Organization === a._id.Organization),
      1
    )
  }
  db.users.save(user)
})


В ответ получите документы в поле docs которых будут _id с одинаковыми linkRole и удалить их уже в клиентском коде
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы