Выявление дубликатов в CouchDB - PullRequest
6 голосов
/ 27 января 2012

Я новичок в CouchDB и документ-ориентированных базах данных в целом.

Я играл с CouchDB и смог ознакомиться с созданием документов (с помощью perl) и использованием функций Map / Reduce в Futon для запроса данных и создания представлений.

Одна из вещей, которые я до сих пор пытаюсь выяснить, - это как идентифицировать дублирующиеся значения в документах с помощью Futon's Map / Reduce.

Например, если у меня есть следующие документы:

{
  "_id": "123",
  "name": "carl",
  "timestamp": "2012-01-27T17:06:03Z"
}

{
  "_id": "124",
  "name": "carl",
  "timestamp": "2012-01-27T17:07:03Z"
}

И я хотел получить список идентификаторов документов с дублирующимися значениями «name», это то, что я мог бы сделать с Futon Map / Reduce?

Результат, которого мы надеялись достичь, следующий:

{
  "name": "carl",
  "dupes": [ "123", "124" ]
}

.. или ..

{
  "carl": [ "123", "124" ]
}

.., которое будет значением, и идентификаторы связанных документов, которые содержат эти повторяющиеся значения.

Я пробовал несколько разных вещей с Map / Reduce, но, насколько я понимаю, функция Map работает с данными для каждого документа, а функции Reduce позволяют работать только с ключами / значениями. из данного документа.

Я знаю, что могу просто получить нужные мне данные с помощью perl, поработать там и получить желаемый результат, но сейчас я пытаюсь работать только с CouchDB, чтобы лучше понять его преимущества / ограничения.

Другой способ, которым я думаю об этом, - использовать один документ, такой как таблица RDBMS:

{
  "_id": "names",
  "rec1": {
    "_id": "123",
    "name": "carl",
    "timestamp": "2012-01-27T17:06:03Z"
  },
  "rec2": {
    "_id": "124",
    "name": "carl",
    "timestamp": "2012-01-27T17:07:03Z"
  }
}

.. что должно позволить мне использовать функции Map / Reduce так, как я первоначально думал. Однако я не уверен, что это идеально.

Я понимаю, что мой разум все еще застрял в земле СУРБД, поэтому многое из того, что я пытаюсь сделать выше, может не понадобиться. Любое понимание этого будет высоко ценится.

Спасибо!

Редактировать: Исправлен синтаксис JSON в некоторых примерах.

1 Ответ

7 голосов
/ 28 января 2012

Если вы просто хотите получить список уникальных значений, это довольно просто.Если вы хотите идентифицировать дубликаты, то это становится менее простым.

В обоих случаях должно быть достаточно такой функции карты:

function (doc) {
   emit(doc.name);
}

Для функции сокращения просто введите _count.

Результат вашего просмотра будет выглядеть следующим образом: (на основе ваших 2 документов)

{
    "rows": [
        { "key": "carl", "value": 2 }
    ]
}

Оттуда у вас будет список имен и их частота.Вы можете взять этот список и отфильтровать его самостоятельно, или вы можете выбрать маршрут «все диваны» и использовать _list функцию для выполнения этой окончательной фильтрации.о _list функциях, они довольно удобны и универсальны.

...