2012-12-24 8 views
9

Zaczynam z Meteorem i potrzebuję pomocy z Mongo. Mam kolekcję nazw, które wyświetlam na liście i chcę móc aktualizować jedną zmienną określonych pozycji w bazie danych na podstawie innych kryteriów. Zasadniczo chcę zrobić:Meteor/Mongo: Wyszukiwanie i aktualizacja niektórych elementów w kolekcji

Dla każdego wpisu, w którym charakterystyka A ​​= prawda i B = prawda, zmienić charakterystykę C na fałsz.

Do tej pory próbowałem dowiedzieć się, w jaki sposób Mongo może obsłużyć "dla każdego" pętlę nad elementami kolekcji, a dla każdego elementu sprawdzić, czy warunki A i B są przechowywane, a następnie collection.update (element, {C: false}). To okazuje się o wiele bardziej problematyczne, niż myślałem. Chcę zrobić coś takiego (z użyciem manekina nazwy zmiennych):

for (i = 0; i < collection.find().count(); i++){ 
    if (collection[i].A===true && collection[i].B===true) 
     collection.update(collection[i], {$set: {C: false}}); 
}; 

byłem zmieniając ten kod bazowy wokół, ale zaczynam odczuwać, że jestem brakuje czegoś podstawowe o indeksowanie/kolekcje jak pracować w Mongo. Czy możesz zindeksować taką kolekcję (a jeśli tak, to czy jest to najwygodniejszy sposób robienia tego, co próbuję zrobić?)?

Odpowiedz

14

Oczywiście wiem, jak to zrobić zaraz po wysłaniu i oczywiście jest to sugerowane w dokumentacji Meteora!

I, oczywiście, jest to proste rozwiązanie:

collection.update({A: true, B: true}, {$set: {C:false}}); 
+2

Możesz zaakceptować własną odpowiedź :-) – Rahul

+1

Działa to tylko dla pierwszego dokumentu pasującego do selektora. Potrzebujesz. collection.update ({A: true, B: true}, {$ set: {C: false}}, 0,1); dla wszystkich rzędów. –

+2

@DavidWihl do edycji wielu wierszy musisz ustawić {multi: true} jako trzeci parametr zamiast 0,1 (patrz meteor docs, http://docs.meteor.com/#update). więc byłoby to: collection.update ({A: true, B: true}, {$ set: {C: false}}, {multi: true}) –

9

Jak już sugerowane w komentarzach, prawidłowa odpowiedź brzmi:

collection.update({A: true, B: true}, {$set: {C:false}}, {multi: true}); 

(Przynajmniej w czystej MongoDB, see there).

Bez multi: true zmieni to tylko jeden dokument spełniający kryteria.

W Meteorze jest to nieco trudniejsze, ponieważ nie można wykonywać aktualizacji po stronie klienta innych niż poprzez dopasowanie go (więc brak możliwości różnych kryteriów, brak możliwości dla multi), patrz http://docs.meteor.com/#update.

Możesz może iterować wszystkie znaleziska, ale byłoby lepiej uruchomić taki kod po stronie serwera.

+0

'multi: true' jest teraz wspierane przez Meteor: http://docs.meteor.com/#/full/update –

Powiązane problemy