Есть ли способ удалить все дубликаты из коллекции? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть коллекция, в которой объекты имеют структуру, похожую на

{'_id': ObjectId('5e691cb9e73282f624362221'), 
 'created_at': 'Tue Mar 10 09:23:54 +0000 2020', 
 'id': 1237308186757120001, 
 'id_str': '1237308186757120001', 
 'full_text': 'See you in July'}

Я пытаюсь сохранить только тот объект, который имеет уникальный полный текст. Использование меняемых только дает мне список значений различных полнотекстовых полей, где я хочу сохранить объект в коллекции только с уникальными полными текстами.

Ответы [ 2 ]

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

Существует 2 способа:

Способ MongoDB

Мы выполняем агрегирование MongoDB, где мы группируем записи по full_text, фильтруем только уникальные документы и вставляем их в коллекцию. (в оболочке)

db.collection.aggregate([
  {
    $group: {
      _id: "$full_text",
      data: {
        $push: "$$ROOT"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $match: {
      count: {
        $eq: 1
      }
    }
  },
  {
    $addFields: {
      data: {
        $arrayElemAt: [
          "$data",
          0
        ]
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$data"
    }
  },
  {
    $out: "tmp"
  }
])

Когда вы выполните этот запрос, он создаст новую коллекцию с уникальными значениями full_text. Вы можете удалить старую коллекцию и переименовать ее.

Вы также можете поместить название своей коллекции в оператор $out, например, {$out:"collection"}, но возврата назад нет .

Python way

Мы выполняем группировку MongoDB по полю full_text, фильтруем дубликаты документов и создаем единый массив со всеми _id, которые необходимо удалить. Как только MongoDB возвращает результаты, мы выполняем команду remove для дубликатов документов.

db.collection.aggregate([
  {
    $group: {
      _id: "$full_text",
      data: {
        $push: "$_id"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $match: {
      count: {
        $gt: 1
      }
    }
  },
  {
    $group: {
      _id: null,
      data: {
        $push: "$data"
      }
    }
  },
  {
    $addFields: {
      data: {
        $reduce: {
          input: "$data",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

Псевдокод

data = list(collection.aggregate(...))
if len(data) > 0:
    colleciton.remove({'_id':{'$in':data[0]["data"]}})
0 голосов
/ 11 марта 2020

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

dict = {"a": 1, "b": 2, "c": 3, "a": 5, "d": 4, "e": 5, "c": 8}

#New clean dictionary
unique = {}
#Go through the original dictionary's items
for key, value in dict.items():
    if(key in unique.keys()):
    #If the key already exists in the new dictionary
        continue
    else:
    #Otherwise
        unique[key] = value

print(unique)

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...