2013-04-08 4 views
5

Considerare il seguente codice, che sto utilizzando per recuperare i dati dal mio server MongoDB locale.Come rinominare/alias i campi mentre lo si preleva da MongoDB attraverso la query usando l'unità nativa MongoDB-Node.JS?

var Db = require('mongodb').Db, 
    MongoClient = require('mongodb').MongoClient, 
    Server = require('mongodb').Server, 
    ReplSetServers = require('mongodb').ReplSetServers, 
    ObjectID = require('mongodb').ObjectID, 
    Binary = require('mongodb').Binary, 
    GridStore = require('mongodb').GridStore, 
    Code = require('mongodb').Code, 
    BSON = require('mongodb').pure().BSON, 
    assert = require('assert'); 
var db = new Db('test', new Server('localhost', 27017)); 
db.open(function(err, db) { 
    db.createCollection('simple_limit_skip_find_one_query', function(err, collection) { 
    assert.equal(null, err); 

    collection.insert([{a:1, b:1}, {a:2, b:2}, {a:3, b:3}], {w:1}, function(err, result) { 
     assert.equal(null, err); 
     collection.findOne({a:1}, {fields:{b:1}}, function(err, doc) { 
     // I got the read document in the object 'doc' 
     }); 
    }); 
    }); 
}); 

Ora, voglio rinominare un nome di campo durante il recupero solo (non nel DB), per esempio con il codice di cui sopra, ho un campo denominato b in oggetto restituito doc io voglio che sia baseID invece di b

C'è un modo per farlo?

Nota: non è possibile intervenire sull'oggetto richiamato doc per rinominare il campo come la ridenominazione della chiave JSON. Voglio che venga interrogato e MongoDB farà lo stesso.

+1

Purtroppo, non tutti i piloti hanno questa caratteristica. C'è una discussione [qui] (http://stackoverflow.com/questions/14106261/do-any-mongodb-orms-allow-you-to-alias-fields) che è ancora rilevante. – WiredPrairie

risposta

4

Utilizzare aggregate framework of MonogDB (ma è necessario upgrade l'istanza del server MongoDB su> = 2.1).

che segue è la soultion per l'esempio precedente

var Db = require('mongodb').Db, 
    MongoClient = require('mongodb').MongoClient, 
    Server = require('mongodb').Server, 
    ReplSetServers = require('mongodb').ReplSetServers, 
    ObjectID = require('mongodb').ObjectID, 
    Binary = require('mongodb').Binary, 
    GridStore = require('mongodb').GridStore, 
    Code = require('mongodb').Code, 
    BSON = require('mongodb').pure().BSON, 
    assert = require('assert'); 
db.open(function (err, db) { 
    if (err) console.dir(err); 
    db.createCollection('simple_limit_skip_find_one_query', function (err, collection) { 
     if (err) console.dir(err); 

     collection.insert([{ a: 1, b: 1 }, { a: 2, b: 2 }, { a: 3, b: 3}], { w: 1 }, function (err, doc) { 
      if (err) console.dir(err); 

      collection.aggregate([ 
      { $project: { 
       a: 1, 
       _id:0, 
       baseID: "$b" 
      } 
      } 
      ], function (err, doc) { 
       if (err) console.dir(err); 
       console.log(doc); 
      }); 
     }); 
    }); 
}); 

uscita:

[ { a: 1, baseID: 1 }, 
    { a: 2, baseID: 2 }, 
    { a: 3, baseID: 3 }] 
+1

Non lo userei normalmente per motivi di prestazioni e leggibilità. Non rende il tuo codice più leggibile. Probabilmente scriverei un insieme di funzioni che gestiscono i mapping necessari in JavaScript. – WiredPrairie

Problemi correlati