2012-04-16 16 views
26

Próbuję utworzyć unikalny indeks dwu kolumnowy na bazowym mongodb w aplikacji meteorologicznej i mający problemy. Nie mogę znaleźć niczego w dokumentach meteorytów. Próbowałem z chromowanej konsoli. Próbowałem od czasu do czasu, a nawet próbowałem wskazać mongodę na/db/dir wewnątrz .meteor. Próbowałem odmianyJak dodać unikalny identyfikator dwukolumnowy do mongody w aplikacji meteorów?

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

Chcę móc zapobiegać zduplikowanym wpisom w kolekcji meteor app mongo.

Zastanawiasz się, czy ktoś to wymyślił?

Odpowiedziałem na własne pytanie, noob.

Wymyśliłem to.

  1. start meteor serwer

  2. Otwarte 2-te Terminal i wpisz meteor mongo

Następnie należy utworzyć indeks ... na przykład zrobiłem dla nich zapisów thumbsup i thumbsdown systemie typu.

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

Teraz, po prostu trzeba znaleźć instalator instalacji bootstrap, który tworzy je, gdy jest popychany do prod zamiast ręcznie.

+1

Przekazałem swoją odpowiedź, zanim zobaczyłem twoją edycję, ale pamiętaj, że tylko umożliwiając indeksowanie po stronie serwera, użytkownicy będą sądzić, że dają wielokrotne przeboje, nawet jeśli nie są faktycznie zapisywane. Więc prawdopodobnie najlepiej zapytać przed wstawieniem jako obejścia tego problemu. – danny

+3

Byłoby lepiej, jeśli zamieścisz własną odpowiedź oddzielnie od pytania. Jest bardziej czytelny. – zVictor

Odpowiedz

15

Zgodnie z docs "Minimongo obecnie nie ma indeksów. Wkrótce to nastąpi." A patrząc na metody dostępne w Kolekcji, nie ma żadnego ensureIndex.

Można uruchomić meteor mongo dla powłoki mongo i włączyć indeksy po stronie serwera, ale obiekt Collection nadal nie będzie o nich wiedział. Dzięki temu aplikacja pozwala dodawać wiele instancji do pamięci podręcznej kolekcji, podczas gdy po stronie serwera dodatkowe wstawki będą zawierane cicho (błędy zostaną zapisane na wyjściu). Po wykonaniu twardego odświeżania strony, aplikacja ponownie synchronizację z serwerem

Więc najlepiej teraz jest chyba zrobić coś takiego:

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

co oczywiście nie jest idealny, ale działa ok. Możesz także włączyć indeksowanie w mongodb na serwerze, więc nawet w przypadku wyścigu nie otrzymasz duplikatów rekordów.

+0

Dziękuję @danny Właśnie dostrzegałem to zachowanie, gdy ten post wszedł. –

+0

BTW, dla każdego zastanawiasz się, zaimplementowałem oba. Powyższa logika na przednim końcu i unikalny indeks na tylnym końcu dla bezpieczeństwa i zdrowia psychicznego. –

+3

To obejście wciąż nie wydaje się idealne. Co, jeśli wywołasz 'MyCollection.find' zanim aplikacja wyciągnie wszystkie dane z serwera? – Lloyd

1

Właściwie dlaczego nie korzystać upsert na serwerze z Meteor.method i można również wysłać również śledzić go z TS: // Server Tylko

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

// Client

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

// rzeczywisty kod działający na serwerze:

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

Według docs.meteor.com upsert nie jest jeszcze obsługiwany przez Mongo/MiniMongo. W przeciwnym razie byłoby dobrze. –

+0

Mam to działa na serwerze, na podstawie jednego identyfikatora/klucza. – limeyd

+0

działa upsert? bardzo dobra wiadomość, że kod działa teraz może najnowsze wersje Meteora naprawiły to? Nie wiedziałbym, nie użyłem Meteoru w ciągu kilku tygodni. –

31

Kolekcja._ensureIndex (indeks, opcje)

Poszukując kodu źródłowego Meteor, znalazłem powiązanie z ensureIndex o nazwie _ensureIndex. Dla pojedynczych kluczy podstawowych indeksów można pójść za przykładem packages/accounts-base/accounts_server.js który zmusza unikalnych nazw użytkowników na Meteor:

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

uniwersalnym kluczem „związek” indeksy:

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

poprzednim kodzie po umieszczeniu po stronie serwera, zapewnia ustawienie indeksów.

Warning

ostrzeżenie realizacja _ensureIndex:

Będziemy rzeczywiście zaprojektować API indeksu później. Na razie przekazujemy po prostu do Mongo, ale robimy to synchronicznie.

+0

Każdy pomysł na co znaczy "przestrzeń: 1"? –

3

Smartpackage aldeed:collection2 obsługuje unikalne indeksy, a także walidację schematu. Walidacja będzie występować zarówno na serwerze, jak i na kliencie (reaktywnie), dzięki czemu można reagować na błędy na kliencie.

+1

Ale nie można go użyć do tworzenia indeksów złożonych: https://github.com/aldeed/meteor-collection2#index-andunique –

Powiązane problemy