созданная коллекция пытается удалить повторяющиеся записи - PullRequest
0 голосов
/ 09 июля 2020

Я создал коллекцию test_emp

/* 1 */
{
    "_id" : ObjectId("5e84200bdf949c00404ed5ff"),
    "area" : "573",
    "bc" : "NZ",
    "bd" : "52001450",
    "bg" : "52001450",
    "borg" : "f52001450",
    "bsg" : "54878",
    "bsgname" : "INFORMATION TECHNOLOGY",
    "o" : "S",
    "friendlyCountryName" : "NZ",
    "ctel" : "+1",
    "mail" : "tl2625@nz.at.com",
    "exch" : "204",
    "ext" : "5408",
    "facsimileTelephoneNumber" : null,
    "givenName" : "POMAS",
    "employeeNumber" : "45629"
}

/* 2 */
{
    "_id" : ObjectId("5e84200bdf949c00404ed600"),
    "area" : "573",
    "bc" : "NZ",
    "bd" : "52001450",
    "bg" : "52001450",
    "borg" : "f52001450",
    "bsg" : "54878",
    "bsgname" : "INFORMATION TECHNOLOGY",
    "o" : "S",
    "friendlyCountryName" : "NZ",
    "ctel" : "+1",
    "mail" : "tl2625@nz.at.com",
    "exch" : "204",
    "ext" : "5408",
    "facsimileTelephoneNumber" : null,
    "givenName" : "POMAS",
    "employeeNumber" : "45629"
}

Я хочу удалить повторяющиеся записи, сначала проверяя следующие запросы для агрегатной функции:

db.test_emp.aggregate({ $group: { _id: { "employeeNumber": "$employeeNumber", "givenName" : "$givenName" }}})



Error:
TypeError: pipeline[(pipeline.length - 1)] is undefined 
Details:
DB.prototype._runAggregate@src/mongo/shell/db.js:236:1
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1062:12
DBCollection.prototype.aggregate@:1:355
@(shell):1:1

Также пробовал с помощью команды удаления дубликатов :

db.test_emp.ensureIndex( { employeeNumber:1 }, { unique:true, dropDups:true } )

errmsg" : "E11000 duplicate key error collection: phone.test_emp index: employeeNumber_1 dup key: { : \"0249527\" }",
    "code" : 11000,

пожалуйста, предложите какие-либо запросы, которые будут использоваться для удаления этих повторяющихся записей из коллекции.

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Это менее сложно, если вы не хотите сохранять _id ключ документов.

db.test_emp.aggregate([
    {
        "$project": {
            "_id": 0
        }
    },
    {
        "$group": {
            "_id": "$$ROOT"
        }
    },
    {
        "$replaceRoot": {"newRoot": "$_id"}
    },
    {
        "$out": "test_emp2"
    }
])

Затем вы можете удалить исходную коллекцию и заменить вновь созданную временную коллекцию исходной коллекцией .

db.test_emp.drop()
db.test_emp2.renameCollection("test_emp")

ПРЕДУПРЕЖДЕНИЕ: Если вы это сделаете, вам придется вручную восстановить исходные индексы коллекции. Кроме того, ключ _id не будет сохранен.

Сделайте резервную копию, прежде чем продолжить эту ментодолгию.

Примечание: @ Gibbs ответ на этот вопрос предпочтительнее, если вы хотите сохранить _id и знакомы с командами mongodump и mongorestore.

0 голосов
/ 09 июля 2020

У вас есть пара проблем.

db.test.aggregate([
  {
    $group: {
      _id: {
        "employeeNumber": "$employeeNumber",
        "givenName": "$givenName"
      }
    }
  }
])
  1. aggregate query следует заключить в []

  2. Вы не можете создать индекс в существующей коллекции, поскольку у вас уже есть дублированные данные.

Итак, что вы можете сделать сейчас:

  1. Создать коллекцию
  2. Создать уникальные индексы - вторая команда, которую вы пробовали
  3. Создать дамп из существующей коллекции mongodump
  4. Загрузить в новую коллекцию.
  5. Отбросить старую коллекцию.
  6. Переименуйте новую коллекцию в свое старое название коллекции
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...