2012-09-09 18 views
6

Powiedzmy, że chcę zachować listę pozycji na użytkownika (w MongoDB z Mongoose ODM w środowisku Node.js), a następnie zapytanie, czy dany element jest własnością użytkownika. Na przykład chcę zapisać wszystkie ulubione kolory każdego użytkownika, a następnie sprawdzić, czy określony kolor jest własnością określonego użytkownika. Wydaje mi się, że lepiej byłoby przechowywać kolory jako obiekt osadzony w dokumencie użytkownika, niż tablicę w dokumencie użytkownika. Powodem, dla którego jest to, że wydaje się bardziej wydajne, aby sprawdzić, czy istnieje kolor w obiekcie, jak można po prostu sprawdzić, czy właściwość obiektu istnieje:MongoDB arrays vs objects

if(user.colors.yellow){ 
    //true case 
} else { 
    //false case 
} 

Versus tablicy gdzie mam iterację cała tablica, czy kolor istnieje gdzieś w tablicy:

for (var i = 0; i < user.colors.length; i++) { 
    if(user.colors[i] === "yellow"){ 
    //true case 
    } else { 
    //false case 
    } 
} 

jednak z wielu przykładów widziałem w internecie, wydaje się, że za pomocą tablic do tego typu rzeczy jest dość powszechne. Czy czegoś brakuje? Jakie są plusy/minusy i najlepszy sposób na zrobienie tego?

+1

można dostarczyć żadnych linków do takich rad? – c69

Odpowiedz

2

Nie musisz używać pętli for, jeśli kolory są przechowywane jako tablica. można po prostu użyć indexOf, jak w:

if(user.colors.indexOf("yellow") != -1){ 
    //true case 
} 

Powiedział, że to naprawdę nie powinno mieć znaczenia, czy inaczej, czy użyć wbudowanego dokument lub tablicę; to nie jest tak, że jeden lub drugi daje ogromną przewagę wydajności.

+0

"To nie jest tak, że jeden lub drugi daje ogromną przewagę wydajności". Czy to prawda?! A jeśli tak, to w jakiej skali. Jeśli jest tylko 8 kolorów, będzie to nieistotne, jeden raz. Ale co z wieloma kolorami lub wielokrotnie dostępnymi w pętli? –

1

Często widzisz osadzone tablice używane do przechowywania tego typu informacji w kolekcjach MongoDB, ponieważ jeśli dodasz indeks do właściwości tablicy, będą one skuteczne do zapytania i będą korzystały z naturalnej składni. W tym przypadku coś jak następuje (zakładając, że zbiór użytkowników, który zawiera właściwość tablicy kolorów):

db.users.find({id: 1, colors: 'yellow'}) 

Jeśli tak to z indywidualnych właściwości kolorystycznych chcesz mieć bardziej niewygodne patrząc zapytanie takiego i że trzeba oddzielnie indeks każdy kolor (zamiast po prostu colors jak byś powyżej):

db.users.find({id: 1, 'colors.yellow': true})