mongoDB: уникальный индекс повторяющегося значения - PullRequest
2 голосов
/ 12 апреля 2011

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

  { 
    name: "bob", 
    email: "bob@gmail.com", 
    logins: [ 
      { u: 'a', p: 'b', public_id: '123' }, 
      { u: 'x', p: 'y', public_id: 'abc' }
    ] 
  }

Моя проблема в том, что мне нужно убедиться, что публичные идентификаторы уникальны в документе и коллекции, Кроме того, существуют некоторые существующие записи, переносимые из базы данных mySQL, которые не имеют записей, и поэтому все они будут заменены значениями null в mongo.

Я считаю, что это либо индекс

db.users.ensureIndex({logins.public_id: 1}, {unique: true});

, который не работает из-за отсутствующих ключей и выбрасывает E11000 duplicate key error index:

или это более фундаментальная проблема схемы в том, что я не должен вкладывать объекты в такую ​​структуру массива. В каком случае что? отдельная коллекция для user_logins ??? что, кажется, идет вразрез с идеей встроенного документа.

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Если вы ожидаете, что u и p будут всегда иметь одинаковые значения на каждой вставке (как в вашем примере фрагмента), вы можете использовать оператор $addToSet на вставках чтобы обеспечить уникальность вашего поля public_id. В противном случае я думаю, что довольно сложно сделать их уникальными для всей коллекции, не работая с внешним обслуживанием или функциями js.

Если нет, я бы мог сохранить их в своей коллекции и использовать поле public_id в качестве _id, чтобы обеспечить уникальность их кросс-документа внутри коллекции. Возможно, это противоречило бы идее встроенных документов в базу данных документов, но в соответствии с различными требованиями я думаю, что это незначительно.

1 голос
/ 13 апреля 2011

Кроме того, существуют некоторые существующие записи, переносимые из БД mySQL, которые не имеют записей, и поэтому все они будут заменены нулевыми значениями в mongo.

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

Если logins.public_id равно null, что нарушит ваше ограничение уникальности, просто не пишите это вообще:

  { 
    logins: [ 
      { u: 'a', p: 'b' }, 
      { u: 'x', p: 'y' }
    ] 
  }
0 голосов
/ 10 мая 2011

Спасибо всем.В конце концов я решил разделить это на 2 коллекции, одну для пользователей и одну для входа в систему.для пользователей это выглядело немного каки не реализовано на уровне приложений.

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