2013-04-08 7 views
5

Rozważ poniższy kod, którego używam do pobierania danych z mojego lokalnego serwera MongoDB.Jak zmienić nazwę/alias pól podczas pobierania z MongoDB przez kwerendę przy użyciu macierzystego napędu 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' 
     }); 
    }); 
    }); 
}); 

Teraz chcę zmienić nazwę nazwę pola podczas pobierania tylko (nie w DB), na przykład z powyższym kodem, mam pole o nazwie b w zwróconym obiekcie doc chcę go mieć baseID zamiast b

Czy jest jakiś sposób to zrobić?

Uwaga: Nie mogę podjąć działania w odniesieniu do pobranego obiektu doc, aby zmienić nazwę pola, np. Zmienić nazwę klucza JSON. Chcę, żeby to było sprawdzane, a MongoDB będzie takie samo.

+1

Niestety, nie wszystkie sterowniki mają tę funkcję. Istnieje dyskusja [here] (http://stackoverflow.com/questions/14106261/do-any-mongodb-orms-allow-you-to-alias-fields), która wciąż ma znaczenie. – WiredPrairie

Odpowiedz

4

Użyj aggregate framework of MonogDB (Ale musisz upgrade instancji serwera MongoDB do> = 2.1).

Poniżej znajduje się soultion na powyższym przykładzie

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); 
      }); 
     }); 
    }); 
}); 

wyjściowa:

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

Nie używałbym tego normalnie ze względu na wydajność i czytelność. To nie sprawia, że ​​twój kod jest bardziej czytelny. Prawdopodobnie napiszę zestaw funkcji, które obsługują niezbędne mapowania w JavaScript. – WiredPrairie