Подтвердить что ты не робот

Как добавить два уникальных идентификатора столбца в mongodb в приложении meteor?

Я пытаюсь создать уникальный индекс с двумя столбцами на базовом mongodb в приложении meteor и иметь проблемы. Я не могу найти ничего в метеорных документах. Я пробовал с хром-консоли. Я пробовал из термина и даже пытался указать mongod на /db/dir внутри. Meteor. Я пробовал

Collection.ensureIndex({first_id: 1, another_id: 1}, {unique: true});.

Я хочу иметь возможность предотвратить дублирование записей в коллекции mongo приложения meteor.

Интересно, понял ли кто-нибудь это?

Я ответил на свой вопрос, что за noob.

Я понял это.

  • Запустить метеоритный сервер

  • Откройте второй терминал и введите meteor mongo

Затем создайте свой индекс... например, я сделал это для записей типа thumbsup и thumbsdown.

db.thumbsup.ensureIndex({item_id: 1, user_id: 1}, {unique: true})
db.thumbsdown.ensureIndex({item_id: 1, user_id: 1}, {unique: true})

Теперь просто нужно выяснить установку установки bootstrap, которая создает их при нажатии на prod вместо ручного.

4b9b3361

Ответ 1

В соответствии с docs "Minimongo в настоящее время не имеет индексов. Это скоро появится". И глядя на методы, доступные в коллекции, нет ensureIndex.

Вы можете запустить meteor mongo для оболочки mongo и включить индексы на стороне сервера, но объект Collection все равно не будет знать о них. Таким образом, приложение позволит вам добавить несколько экземпляров в кеш коллекции, в то время как на стороне сервера дополнительные вставки будут терпеть неудачно (ошибки записываются на выходе). Когда вы сделаете жесткое обновление страницы, приложение будет повторно синхронизироваться с сервером

Таким образом, ваш лучший выбор сейчас - это, вероятно, сделать что-то вроде:

var count = MyCollection.find({first_id: 'foo', another_id: 'bar'}).count()
if (count === 0)
    MyCollection.insert({first_id: 'foo', another_id: 'bar'});

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

Ответ 2

Collection._ensureIndex (индекс, параметры)

Поиск в исходном коде Meteor, я обнаружил привязку к обеспечениюIndex с именем _ensureIndex. Для базовых индексов с одним ключом вы можете следовать примеру packages/accounts-base/accounts_server.js, который заставляет уникальные имена пользователей в Meteor:

Meteor.users._ensureIndex('username', {unique: 1, sparse: 1});

Для многозначных "составных" индексов:

Collection._ensureIndex({first_id:1, another_id:1}, {unique: 1});

Предыдущий код при размещении на стороне сервера гарантирует, что индексы будут установлены.

Внимание!

Уведомление о предупреждении об ошибке _ensureIndex:

Мы разработаем API-интерфейс позже. Пока мы просто проходим до Монго, но сделайте его синхронным.

Ответ 3

Smartpackage aldeed: collection2 поддерживает уникальные индексы, а также проверку схемы. Проверка будет происходить на сервере и клиенте (реактивно), поэтому вы можете реагировать на ошибки на клиенте.

Ответ 4

На самом деле, почему бы не использовать upsert на сервере с Meteor.method, и вы также можете отправить также отслеживать его с помощью ts: // Только сервер

Meteor.methods({
 add_only_once = function(id1,id2){
   SomeCollection.update(
     {first_id:id1,another_id:id2},{$set:{ts:Date.now()}},{upsert:True});
 }
});

//Клиент

Meteor.call('add_only_once',doc1._id, doc2._id);

//фактический код, запущенный на сервере

if(Meteor.is_server) {
    Meteor.methods({
        register_code: function (key,monitor) {
             Codes.update({key:key},{$set:{ts:Date.now()}},{upsert:true});
        }
     ...