2015-12-30 9 views
6

Jeśli mam te dwa zbiory:Czy istnieje sposób na indeksowanie dokumentu w mongoDB wypełniając jego referencje?

Book: { 
title: String, 
description: String 
author: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
} 

User: { 
_id: (generated by mongo) 
username: String 
} 

I chcę indeksu książka dla FTS. Czy mogę zrobić to w taki sposób, że będzie można je wyszukać za pomocą nazwy użytkownika, mimo że nazwy użytkowników nie są jawnie przechowywane w zbiorze książek?

Innymi słowy, czy jest możliwe (lub wskazane) zindeksowanie zaludnionej kolekcji?

Dzięki

+0

odnoszą się do nich: http://stackoverflow.com/questions/13026486/how-to-populate-a-sub-document-in-mongoose-after-creating-it http: // mongoosejs. com/docs/api.html # model_Model.populate –

+0

Więc dodając index: true, odwołanie zostanie zaindeksowane w kolekcji? –

+4

Nie. Nie jest możliwe wyszukiwanie (FTS lub inne) danych zawartych w "username" (lub innym polu) z innej kolekcji. Jest to "sprzężenie", które jest czymś, czego MongoDB nie robi (wyłączając agregację '$ lookup'), a" zapełnianie "nie jest tak naprawdę sprzężeniem, ale po prostu wygodnym otokiem wokół uruchamiania osobnych zapytań wyszukiwania. Możesz tylko poprosić bazę danych o wyszukiwanie danych z jednej kolekcji tylko na raz. –

Odpowiedz

1

Jak wspomniano Blakes Siedem, to nie jest możliwe, aby wskaźnik w całej kolekcji.

W przypadkach, w których tego rodzaju wyszukiwanie pełnotekstowe było najważniejsze dla mojej aplikacji, klasycznym rozwiązaniem jest denormalizacja pola i uwzględnienie go w obu kolekcjach. W tym przypadku, kolekcja Book wyglądałby następująco:

Book: { 
    title: String, 
    description: String 
    author: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'User', 
    ### New field ### 
    username: String 
    }, 
} 

teraz można indeks author.username.

Jest całkowicie zależne od aplikacji, czy jest to dobry pomysł. Wady obejmują synchronizację między kolekcjami i niepotrzebne dodawanie wagi do każdego dokumentu.

Powiązane problemy