2015-04-21 15 views
6

Pytam o znalezienie dokładnego dopasowania tablicy i pomyślnie go pobrałem, ale gdy próbuję znaleźć dokładną tablicę z wartościami w różnych porządkach, to się nie uda.MongoDB Znajdź dokładny układ dopasowania, ale zamówienie nie ma znaczenia

Example

db.coll.insert({"user":"harsh","hobbies":["1","2","3"]}) 
db.coll.insert({"user":"kaushik","hobbies":["1","2"]}) 
db.coll.find({"hobbies":["1","2"]}) 

2-te Dokument Źródło Pomyślnie

db.coll.find({"hobbies":["2","1"]}) 

Pokazano Nic

Proszę o pomoc

Odpowiedz

13

currently accepted answer NIE zapewnia dokładnego dopasowania w twojej macierzy, tylko że rozmiar jest identyczny i że tablica współdzieli co najmniej jeden element z tablicą zapytań.

Na przykład, zapytanie

db.coll.find({ "hobbies": { "$size" : 2, "$in": [ "2", "1", "5", "hamburger" ] } }); 

nadal zwracają Kaushik użytkownika w tym przypadku.

Co trzeba zrobić na dokładne dopasowanie jest łączenie $size z $all, tak:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] } }); 

Ale należy pamiętać, że może to być bardzo kosztowna operacja, w zależności od wysokości i struktury danych . Ponieważ MongoDB utrzymuje porządek w dodanych tablicach, możesz lepiej radzić sobie z zapewnieniem uporządkowania tablic podczas wstawiania do bazy danych, dzięki czemu podczas kwerend możesz polegać na statycznej kolejności.

7

Aby dokładnie dopasować pole tablicy, Mongo zapewnia operatorowi $eq, który może być obsługiwany przez tablicę, podobnie jak wartość.

db.collection.find({ "hobbies": {$eq: [ "singing", "Music" ] }}); 

Również sprawdza kolejność, w jakiej określasz elementy.

Jeśli skorzystać z poniższego zapytania:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] } }); 

Wtedy nie będą zwracane dokładne dopasowanie. Załóżmy, że zapytanie:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "2" ] } }); 

To zapytanie zwróci wszystkie dokumenty mające element 2 i ma wielkość 2 (na przykład będzie to również powrót dokument mający hobies :[2,1]).

+0

Hmm, masz rację, nie powinienem używać słów "dokładne dopasowanie" dla mojego przykładu zapytania. Czy znasz rozwiązanie do sprawdzania dokładnego podzbioru wartości (np. Z '$ eq'), ale nie sprawdzasz kolejności? – kasoban

Powiązane problemy