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”]
guilin 桂林
źródło

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
Jeff the Bear
źródło
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ł.

heinob
źródło
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