2013-04-08 7 views
5

Betrachten Sie den folgenden Code, den ich verwende, um die Daten von meinem lokalen MongoDB-Server abzurufen.Wie Umbenennen/Alias-Feld (e) beim Abrufen von MongoDB aus Abfrage über MongoDB-Node.JS native Laufwerk?

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

Nun möge ich einen Feldnamen umbenennen, während nur (nicht im DB) abrufen, beispielsweise mit dem obigen Code, ich habe ein Feld b in dem zurückgegebenen Objekt mit dem Namen doc ich mag es baseID sein statt b

Gibt es eine Möglichkeit, es zu tun?

Hinweis: Ich kann keine Aktion für das abgerufene Objekt doc ausführen, um Feld wie JSON-Schlüsselumbenennung umzubenennen. Ich möchte, dass es abgefragt wird und MongoDB wird das Gleiche tun.

+1

Leider sind nicht alle Treiber haben diese Funktion. Es gibt eine Diskussion [http://stackoverflow.com/questions/14106261/do-any-mongodb-orms-allow-you-to-alias-fields], die immer noch relevant ist. – WiredPrairie

Antwort

4

Verwenden Sie aggregate framework of MonogDB (aber Sie müssen upgrade die MongoDB-Server-Instanz zu> = 2.1).

Im Folgenden ist der soultion für das obige Beispiel

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

Ausgang:

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

Ich würde das normalerweise aus Gründen der Leistung und Lesbarkeit nicht verwenden. Es macht Ihren Code nicht lesbarer. Ich würde wahrscheinlich eine Reihe von Funktionen schreiben, die die notwendigen Mappings in JavaScript behandeln. – WiredPrairie

Verwandte Themen