Masz rację co do pewnego stwierdzenia, że dokument BSON nie jest dokumentem XML. Ponieważ XML jest ładowany do struktury drzewa, która składa się z „węzłów”, wyszukiwanie dowolnego klucza jest dość łatwe.
Dokument MonoDB nie jest tak prosty w przetwarzaniu, a pod wieloma względami jest to „baza danych”, więc ogólnie oczekuje się, że będzie miał pewną „jednolitość” lokalizacji danych, aby ułatwić zarówno „indeksowanie”, jak i wyszukiwanie.
Niemniej jednak da się to zrobić. Ale oczywiście oznacza to rekurencyjny proces wykonywany na serwerze, a to oznacza przetwarzanie JavaScript za pomocą $where
.
Jako podstawowy przykład powłoki, ale ogólna function
jest po prostu ciągiem argumentu do $where
operator wszędzie indziej:
db.collection.find(
function () {
var findKey = "find-this",
findVal = "please find me";
function inspectObj(doc) {
return Object.keys(doc).some(function(key) {
if ( typeof(doc[key]) == "object" ) {
return inspectObj(doc[key]);
} else {
return ( key == findKey && doc[key] == findVal );
}
});
}
return inspectObj(this);
}
)
Zasadniczo przetestuj klucze obecne w obiekcie, aby sprawdzić, czy pasują do żądanej „nazwy pola” i zawartości. Jeśli jeden z tych kluczy okaże się "obiektem", przejdź do funkcji i ponownie sprawdź.
JavaScript .some()
upewnia się, że "pierwsze" znalezione dopasowanie powróci z funkcji wyszukiwania, podając true
wynik i zwrócenie obiektu, w którym ten „klucz/wartość” był obecny na pewnej głębokości.
Zauważ, że $where
zasadniczo oznacza przemierzanie całej kolekcji, chyba że istnieje inny poprawny filtr zapytań, który można zastosować do „indeksu” w kolekcji.
Dlatego używaj ostrożnie lub wcale i po prostu pracuj nad restrukturyzacją danych do bardziej użytecznej formy.
Ale to da ci dopasowanie.