2012-06-28 5 views
3

У меня есть сборная коллекция манго с документами более 1,5 мил. Я использую столбец _id как ключ осколка, а значения в этом столбце - целые (а не ObjectIds).Дублирующие документы на _id (in mongo)

Я делаю много операций записи в этой коллекции, используя драйвер Perl (вставка, обновление, удаление, сохранение) и mongoimport.

Моя проблема в том, что у меня есть дубликаты документов на одном и том же _id. Из того, что я читал, это не должно быть возможным.

Я удалил дубликаты, но другие все еще появляются.

Есть ли у вас какие-либо идеи, откуда бы они взялись или на что я должен смотреть? (Кроме того, я попытался реплицировать это на меньшую тестовую коллекцию, но никаких дубликатов не вставлены, независимо от того, какую операцию записи я выполняю).

ответ

2

Это действительно не проблема с драйвером Perl .. это связано с характеристиками осколков. MongoDB может только обеспечить уникальность документов, расположенных на одном осколке во время создания, поэтому индекс по умолчанию не требует уникальности.

В документации MongoDB: Configuring Sharding есть конкретное упоминание, что:

  • Когда вы шард коллекцию, необходимо указать ключ осколка. Если в коллекции есть данные, mongo потребует, чтобы индекс был создан заранее (ускоряет процесс chunking); в противном случае для вас автоматически создается индекс.

  • Вы можете использовать опцию {unique: true}, чтобы гарантировать, что базовый индекс обеспечивает уникальность, пока уникальный индекс является префиксом ключа осколка.

  • Если опция «unique: true» не используется, ключ осколка не обязательно должен быть уникальным.

+0

Я просто проверил это, и вы были правы ... опция «unique: true» не была указана :) Большое спасибо, ваш ответ был очень полезен. –

+0

FYI, заметил, что есть новый учебник: [MongoDB: Enforce Unique Keys for Sharded Collections] (http://docs.mongodb.org/manual/tutorial/enforce-unique-keys-for-sharded-collections/). – Stennie

1

Как вы реализовали генерирование целых идентификаторов?

Если вы используете систему, подобную предложенной на веб-сайте MongoDB, вы должны быть в порядке. Для справки:

function counter(name) { 
    var ret = db.counters.findAndModify({ 
     query:{_id:name}, 
     update:{$inc:{next:1}}, 
     "new":true, 
     upsert:true}); 

    return ret.next; 
} 

db.users.insert({_id:counter("users"), name:"Sarah C."}) // _id : 1 
db.users.insert({_id:counter("users"), name:"Bob D."}) // _id : 2 

Если вы создаете ваши Идентификаторы, прочитав последнюю запись в хранилище документов, затем увеличивающееся число в коде Perl, затем вставив с увеличенным числом вы можете быть запущены в вопросы синхронизации.

+0

Вот еще некоторые подробности о процессе: я получаю ежедневные данные, которые я обрабатываю, и вставки/обновления в коллекции. Для столбца _id я использую тот же идентификатор, который я получаю из внешнего источника (для целей производительности). –

Смежные вопросы