Jak sprawdzić, czy pole tablicy zawiera unikalną wartość, czy inną tablicę w MongoDB?


143

Teraz używam mongodb.

Mam kolekcję blogpost, a blogpost ma wpisane tagi, które są tablicą, np

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

Jak mogę przeprowadzić te wyszukiwania

  1. zawiera „tag1”
  2. zawiera ['tag1', 'tag2'],
  3. zawiera dowolny z [„tag3”, „tag4”]

Odpowiedzi:


219

Wypróbuj to:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3

6
Jest to dobrze udokumentowane w pomocy: mongodb.org/display/DOCS/ ...
Scott Hernandez

2
dla $ all oznacza wszystkie elementy ORAZ w podanej kolejności, czy jest po prostu nieuporządkowane?
redben

2
@ScottHernandez Nie widzę, żeby wspominali, że pole, którego używasz podczas wyszukiwania, może być tablicą, i jak to jest obsługiwane. „pole: {$ in: tablica}”. Co się dzieje, gdy szukasz tablicy w tablicy tablic? Nieokreślony.
Zut

Czy jest jakieś INDEKSOWANIE, które możemy zrobić na tablicach, aby zapobiec duplikowaniu? Jeśli tak, poprowadź, jak to zrobić.
Hitesh Joshi

1
@redben jest nieuporządkowany, jak napisano w dokumentacji: $ all operator DOCS . Po prostu przeczytaj część przykładową, a zobaczysz.
Matthias B.

5

Z mojego doświadczenia wynika, że ​​w przypadku (2) następujące rozwiązanie jest znacznie szybsze niż to z „$ all”:

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

ale szczerze mówiąc, nie wiem dlaczego. Byłbym zainteresowany, gdyby ktoś wiedział.


1
Swoją drogą, właśnie przetestowałem to na liście indeksowanych słów kluczowych. Absolutnie ten sam wynik z $ i $ all
isox

Może w międzyczasie zmieniło się to wraz z nowszymi wersjami.
heinob

To poszlaki. Dla „$ i” mongodb wykonuje operację logiczną „i”. Dlatego jeśli pierwsze wyrażenie jest fałszywe, drugie nie jest brane pod uwagę. Oznacza to mniej przetwarzania.
kubudi

Ale powinno się to również zdarzyć w przypadku „$ all”, prawda !?
heinob

1
$ all to prawdopodobnie dwa wyszukiwania w indeksie, $ i prawdopodobnie jest jednym wyszukiwaniem z sekwencyjnym skanowaniem wyniku.
Evan Carroll
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.