2011-09-18 24 views
6

Ho i seguenti schemi; L'indirizzo è una posizione geocoded e l'agenzia ha molti indirizzi. La mia domanda è, se voglio essere in grado di eseguire una ricerca geospaziale su un'agenzia basata sui suoi indirizzi, allora ho bisogno di indicizzarli in qualche modo a livello di agenzia (già indicizzati a livello di schema degli indirizzi)?Posso/dovrei indicizzare un documento incorporato in Mongoose?

Inoltre, sto avendo difficoltà a trovare informazioni su come trovare in base ai documenti nidificati. In questo scenario, è persino possibile fare ciò che spero o dovrei espandere un po 'la struttura del mio dominio e avere un "IndirizzoAgenzia"? Questo approccio mi sembra un po 'RDBMS ma posso anche vederne i vantaggi.

Sono un po 'confuso su come utilizzare gli oggetti ObjectId da Agenzia (o un oggetto Bridge AgencyAddress) senza un collegamento invertito dall'indirizzo. Non voglio avere collegamenti indietro perché l'indirizzo verrà utilizzato da numerosi altri oggetti nell'app.

Grazie!

var AddressSchema = new Schema({ 
    name  : {type: String, default : ''}, 
    street1  : {type: String, default : ''}, 
    street2  : {type: String, default : ''}, 
    city  : {type: String, default : '', required: true}, 
    state  : {type: String, required : true}, 
    zip   : {type: String, default ''}, 
    country  : {type: String}, 
    location : {longitude: Number, latitude:Number} 
    type  : {type: String, enum:['agent', 'agency', 'registrant'], index:true} 
    created_at : {type: Date, default: Date.now}, 
    updated_at : {type: Date, default: Date.now} 
    primary  : {type: Boolean, default: false} 
}); 

AddressSchema.index({location: '2d'}); 

Agenzia:

var AgencySchema = new Schema({ 
    name   : {type : String, default : '', required : true}, 
    Type   : {type : String, enum['medical', 'disaster-service', 'local-law', 'state-law', 'federal-law'], index:true}, 
    Addresses : [Address], 
    created_at : {type : Date, default : Date.now}, 
    updated_at : {type : Date, default : Date.now} 
}); 

risposta

11

Non ho esperienza con la mangusta, in modo che io possa spiegare MongoDB indicizzazione in generale. Dalla tua domanda capisco che più documenti geocodificati Address incorporati in Agency.

Se si utilizza la versione mongodb < = 1.8, non è possibile indicizzare i documenti geocodificati nidificati. Ma la funzionalità è stata aggiunta dalla versione 1.9. Sto usando con successo da un paio di mesi per lo stesso tipo di schema. Ma era un ramo di sviluppo (instabile).

fortunatamente la versione 2.0 è stata rilasciata una settimana fa. E 'stabile. Controlla il link 2.0 Release Notes per maggiori informazioni.

E non è possibile indicizzare direttamente sui documenti incorporati.

che deve essere fatto in questo modo da shell mongodb

db.Agency.ensureIndex({"Address.location": 2d}) 

non so la sintassi esatta per la mangusta, può essere come questo

AgencySchema.index({'Address.location': '2d'}); 

check out il mongodb indexing per maggiori informazioni

+0

Ah, questo è l'uomo perfetto. Grazie. – Chance

+0

Non mi sembra perfetto. È davvero un requisito che l'indice venga creato nella console di mongo ?! – Greg

+1

@Greg "È davvero un requisito che l'indice venga creato nella console mongo", non lo è affatto, puoi farlo tramite qualsiasi driver di lingua che usi, l'ho detto dalla console perché non ho alcuna esperienza con mangusta – RameshVel

Problemi correlati