【问题标题】:Return partial documents from Node API querying Mongo从 Node API 查询 Mongo 返回部分文档
【发布时间】:2016-08-31 12:37:52
【问题描述】:

我有一个 Node API 正在查询我的 Mongo 数据库。

我能够返回集合中的所有文档。现在,我想返回部分文档。

我的模型(即 Player.js)如下所示:

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

我的应用程序如下所示:

//...

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

//...

我想查询我的玩家集合中的所有文档,但当我转到“.../api/players/player_names”时只返回 player_name

我认为添加下面的代码会起作用,但它没有......

这在我的模型上:

// [previous code]

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

这在我的 app.js 上:

//...

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

//...

【问题讨论】:

  • Player.find(callback,player_name:1) 在语法上不正确应该类似于Player.find(callback,{player_name:1}),此外,您应该传递查询、选择器,然后最后传递回调。或者您可以将 select() 链接到查询上,然后调用 exec() 您将回调传递给它。
  • 另外,如果你想在这个模型上添加方法,你应该在定义模型之前在模式上使用静态方法。例如。 playerSchema.statics.getPlayerNames = function... 然后使用 this 访问模型,例如。 this.find(...)
  • 对不起,我对 Node 和 Mongo 还很陌生...我做了您建议的更改 Player.find(callback,{player_name:1}) 并返回整个文档...跨度>

标签: node.js mongodb mongoose


【解决方案1】:

你可能想要这样的东西:

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

这将返回类似[{_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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多