2016-08-31 9 views
0

私のMongoデータベースを照会しているNode APIがあります。ノードAPIクエリの一部のドキュメントを返すMongo

コレクション内のすべてのドキュメントを返すことができます。さて、私は部分的な書類を返却したい。

私のモデル(すなわちPlayer.js)は次のようになります。私は選手たちのコレクション内のすべての文書を照会したい

//... 

app.get('/api/players',function(req,res){ 
    Player.getPlayers(function(err,players){ 
     if(err){ 
      throw err; 
     } 
     res.json(players); 
    }); 
}); 

//... 

が、リターン:

var mongoose = require('mongoose'); 

// Create schema for players 
var playerSchema = mongoose.Schema(
    { 
     player_name:String, 
     goals:Number, 
     clubs: 
     { 
      club_name:String, 
      season:String 
     } 
    } 
); 

var Player = module.exports = mongoose.model('Player',playerSchema); 

// get all players 
module.exports.getPlayers = function(callback, limit){ 
    Player.find(callback).limit(limit); 
}; 

私のアプリケーションは、このようになります。私が ".../api/players/player_names"に行くときのplayer_nameのみ

私は以下のコードを追加することはうまくいくと思っていましたが、そうではありません...

私のapp.js上

// [previous code] 

// get all player names 
module.exports.getPlayerNames = function(callback,limit){ 
    Player.find(callback,player_name:1).limit(limit) 
} 

これを:私のモデルに

この

var mongoose = require('mongoose'); 

// Create schema for players 
var playerSchema = mongoose.Schema(
    { 
     player_name:String, 
     goals:Number, 
     clubs: 
     { 
      club_name:String, 
      season:String 
     } 
    } 
); 

//Its most common to pass the callback last, as this is what others do 
playerSchema.statics.getPlayers = function(limit, callback){ 
    this.find({}) 
    .select('player_name') 
    .limit(limit) 
    .exec(callback); 
}; 

module.exports = mongoose.model('Player',playerSchema); 

が返されます:

//... 

app.get('api/players/player_names',function(req,res){ 
    Player.getPlayerNames(function(err,players){ 
     if(err){ 
      throw err; 
     } 
     res.json(players); 
    }); 
}); 

//... 
+0

'Player.find:あなたはプレイヤー名の配列だけ返すようにしたい場合は

(コールバック、PLAYER_NAME:1)' 'Player.findのようなもの(コールバック、{PLAYER_NAMEあるべき文法的に間違っています:1}) 'さらに、クエリ、セレクタ、コールバックを最後に渡す必要があります。つまり、 'select()'をクエリに連鎖させてから、コールバックを渡す 'exec()'を呼び出すことができます。 – tsturzl

+0

さらに、このモデルにメソッドを追加する場合は、モデルを定義する前にスキーマで静的メソッドを使用する必要があります。例えば。 'playerSchema.statics.getPlayerNames = function ...'そして 'this'を使ってモデルにアクセスします。 'this.find(...) ' – tsturzl

+0

申し訳ありません、私はNode&Mongoの新機能です。Player.find(コールバック、{player_name:1})の変更を行い、ドキュメント全体を返します。 – Victor

答えて

0

は、おそらくこのようなものをお勧めします結果は[{_id: ObjectId, player_name: "player1"}, ...]です。

var mongoose = require('mongoose'); 

// Create schema for players 
var playerSchema = mongoose.Schema(
    { 
     player_name:String, 
     goals:Number, 
     clubs: 
     { 
      club_name:String, 
      season:String 
     } 
    } 
); 

//Its most common to pass the callback last, as this is what others do 
playerSchema.statics.getPlayers = function(limit, callback){ 
    this.find({}) 
    .select('player_name') 
    .limit(limit) 
    .exec(function(err, docs) { 
     if(err) return callback(err); //first argument should be reserved for passing any errors 

     callback(null, docs.map(function(doc) { 
     return doc.player_name; 
     }); 
    }); 
}; 

module.exports = mongoose.model('Player',playerSchema); 
+0

ありがとうございました! :) – Victor

関連する問題