2014-05-21 10 views
23

È possibile rinominare il nome dei campi restituiti in una query di ricerca? Mi piacerebbe usare qualcosa come $rename, tuttavia non vorrei modificare i documenti che sto accedendo. Voglio solo recuperarli in modo diverso, qualcosa che funziona come SELECT COORINATES AS COORDS in SQL.Come rinominare i campi quando si esegue la ricerca/proiezione in MongoDB?

quello che faccio ora:

db.tweets.findOne({}, {'level1.level2.coordinates': 1, _id:0}) 
{'level1': {'level2': {'coordinates': [10, 20]}}} 

Quello che vorrei per essere restituito è: {'coords': [10, 20]}

risposta

23

Quindi, in pratica utilizzando .aggregate() invece di .find():

db.tweets.aggregate([ 
    { "$project": { 
     "_id": 0, 
     "coords": "$level1.level2.coordinates" 
    }} 
]) 

E questo ti dà il risultato che vuoi

MongoDB 2.6 e versioni successive restituiscono un "cursore" proprio come fa find.

Vedere $project e altri aggregation framework operators per ulteriori dettagli.


Per la maggior parte dei casi si dovrebbe semplicemente rinominare i campi come restituito dal .find() durante l'elaborazione del cursore. Per JavaScript come esempio, è possibile utilizzare .map() per farlo.

Dalla shell:

db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map(doc => { 
    doc.coords = doc['level1']['level2'].coordinates; 
    delete doc['level1']; 
    return doc; 
}) 

O, più in linea:

db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map(doc => 
    ({ coords: doc['level1']['level2'].coordinates }) 
) 

questo modo si evita qualsiasi ulteriore sovraccarico sul server e dovrebbe essere utilizzato nei casi in cui il carico di elaborazione aggiuntivo sarebbe superare il guadagno di effettiva riduzione delle dimensioni dei dati recuperati. In questo caso (e soprattutto) sarebbe minimo e quindi meglio rielaborare il risultato del cursore per ristrutturarlo.

Problemi correlati