2012-03-09 14 views
12

Obecnie trwa śledzenie Mongoose i MongoDB dla mojego projektu, ale napotykam na segment, w którym interfejs API jest niejasny.Unikalne wartości tablic w Mongoose

Mam model, który zawiera kilka kluczy i dokumentów oraz jeden z tych kluczy o nazwie watchList. Jest to tablica identyfikatorów oglądanych przez użytkownika, ale muszę mieć pewność, że wartości te pozostaną niepowtarzalne.

Oto przykładowy kod:

var MyObject = new Mongoose.Schema({ 
    //.... 
    watching : {type: Array, required: false}, 
    //.... 
}); 

Więc moje pytanie brzmi: w jaki sposób można się upewnić, że wartości wepchnięta do tablicy tylko kiedykolwiek przechowywać jeden, tak czyniąc wartości unikatowe, mogę tylko używać unique: true?

Dzięki

Odpowiedz

14

Według mojej wiedzy, jedynym sposobem na zrobienie tego w mangurze jest wywołanie podstawowego operatora Mongo (mentioned by danmactough). W mangusta, to by wyglądać tak:

var idToUpdate, theIdToAdd; /* set elsewhere */ 
Model.update({ _id: idToUpdate }, 
      { $addToSet: { theModelsArray: theIdToAdd } }, 
      function(err) { /*...*/ } 
); 

Uwaga: funkcja ta wymaga mangusta wersji> = 2.2.2

+3

can * theIdToAdd * może być tablicą, na przykład '[" ID1 "," ID2 "]'? – RobertPitt

+2

Zgaduję, że można by użyć $ each za to. –

+2

@RoberPitt doskonały punkt ... theIdToAdd nie może być tablicą. Jeśli to zrobisz, element do wstawienia będzie tą tablicą. Próbuję znaleźć sposób na rozwiązanie tego :-( – superiggy

6
+0

Tak więc $ addToSet doda nowy element do tablicy, jeśli już nie zawiera duplikatu. Czy istnieje sposób (na przykład tworzenie unikalnego indeksu), który zapewni, że nigdy nie zostaną zduplikowane w tablicy? Zasadniczo chcę Set zamiast sekwencji. –

1

Mongoose jest model obiektowy dla MongoDB, więc jedna opcja jest traktować dokument jako normalny obiekt javascript.

MyModel.exec(function (err, model) { 
    if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId); 

    model.save(...callback); 
}); 

Chociaż zgadzam się, że mangusty powinien mieć pewne wsparcie dla tego zbudowany w formie walidator dla collection document reference feature - przede wszystkim dlatego większość czasu chcesz dodać tylko unikalne referencje.

+2

To wygrało nie działa, jeśli zestaw został dodany do modelu przez operację współbieżną, a w twoim przykładzie sprawdzasz, czy zestaw istnieje w nieaktualnej kopii modelu, dlatego wymaga wymuszonego unikalnego indeksu na poziomie bazy danych. – ninja123

Powiązane problemy