2013-04-08 12 views
5

私のローカルMongoDBサーバーからデータを取得するために使用している次のコードを考えてみましょう。MongoDB-Node.JSネイティブドライブを使用したクエリを使用してMongoDBからフェッチする際に、フィールドの名前を変更/エイリアスする方法はありますか?

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

は今、私は取得しているときに(ないDBに)、フィールド名を変更したい場合は、上記のコードで、たとえば、私はそれがbaseIDになりたい返されるオブジェクトdocbという名前のフィールドを持っています代わりにb

これを実行する方法はありますか?

注:取得したオブジェクトdocに対して、JSONキーの名前を変更するような名前を変更することはできません。私はそれを照会してMongoDBと同じにしたい。

+1

残念ながら、ないすべてのドライバのこの機能を持っています。まだ関連性のある議論がある(http://stackoverflow.com/questions/14106261/do-any-mongodb-orms-allow-you-to-alias-fields)。 – WiredPrairie

答えて

4

aggregate framework of MonogDBを使用します(ただし、upgrade MongoDBサーバーインスタンスを> = 2.1にする必要があります)。

以下は、上記の例のためsoultionある

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

出力:

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

私はこれを通常、パフォーマンスと可読性の理由から使用しません。コードを読みやすくしません。おそらく、JavaScriptで必要なマッピングを処理する一連の関数を書くだろう。 – WiredPrairie

関連する問題