Mongodb - 查询嵌套的对象数组

时间:2014-05-05 09:47:29

标签: javascript node.js mongodb express

我真的很难用我下面的数据构建一个REST api,一切都在客户端工作正常,但是当我需要发出更新players的POST请求时,我无法弄清楚如何查询mongodb。

路线

router.get('/api/teams/:teamid/player/:playerid', player.getById);

mongodb查询

module.exports = {
    getById: function(req, res) {
        models.Team.findOne({"players.player_name":"Jokim"}, function(err, player) {
            if (err) {
                res.json({error: 'player not found.'});
            } else {
                console.log(player);
                res.json(player);    
            }
        });
    }
};

Json数据

[
   {
      "__v":0,
      "_id":"5362dcf7e99615aa392d7d72",
      "assists":80,
      "blocks":14,
      "feed":null,
      "fouls":20,
      "made_one":10,
      "made_three":5,
      "made_two":15,
      "missed_one":4,
      "missed_three":4,
      "missed_two":20,
      "percentage":50,
      "points":44,
      "rebounds":100,
      "steals":33,
      "team_name":"Bulls",
      "players":[
         {
            "player_name":"Jokim",
            "_id":"5365f079ed4914600d9342c7",
            "team_name":"",
            "team_id":"",
            "points":0,
            "made_one":0,
            "made_two":0,
            "made_three":0,
            "missed_one":0,
            "missed_two":0,
            "missed_three":0,
            "percentage":0,
            "assists":0,
            "rebounds":0,
            "steals":0,
            "blocks":0,
            "fouls":0,
            "feed":""
         },
         {
            "player_name":"Taj",
            "_id":"5365f079ed4914600d9342c6",
            "team_name":"",
            "team_id":"",
            "points":0,
            "made_one":0,
            "made_two":0,
            "made_three":0,
            "missed_one":0,
            "missed_two":0,
            "missed_three":0,
            "percentage":0,
            "assists":0,
            "rebounds":0,
            "steals":0,
            "blocks":0,
            "fouls":0,
            "feed":""
         }
      ]
   },
   {
      "team_name":"Wizards",
      "points":44,
      "made_one":10,
      "made_two":15,
      "made_three":5,
      "missed_one":4,
      "missed_two":20,
      "missed_three":4,
      "percentage":50,
      "assists":80,
      "rebounds":100,
      "steals":33,
      "blocks":14,
      "fouls":20,
      "feed":null,
      "_id":"5362dcf7e99615aa392d7d75",
      "__v":0,
      "players":[
         {
            "player_name":"John Wall",
            "points":22,
            "made_one":3,
            "made_two":4,
            "made_three":5,
            "missed_one":2,
            "missed_two":3,
            "missed_three":4,
            "percentage":5,
            "assists":2,
            "rebounds":2,
            "steals":2,
            "blocks":5,
            "fouls":3,
            "feed":null,
            "facebook_id":null,
            "_id":"5362dcf7e99615aa392d7d77"
         },
         {
            "player_name":"Bradley Beal",
            "points":22,
            "made_one":3,
            "made_two":4,
            "made_three":5,
            "missed_one":2,
            "missed_two":3,
            "missed_three":4,
            "percentage":5,
            "assists":2,
            "rebounds":2,
            "steals":2,
            "blocks":5,
            "fouls":3,
            "feed":null,
            "facebook_id":null,
            "_id":"5362dcf7e99615aa392d7d76"
         }
      ]
   }
]

2 个答案:

答案 0 :(得分:2)

当您尝试在玩家阵列中搜索时,我认为您将不得不使用elemMatch:

请查找与此相关的文档:http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

PS:我没有尝试过这个,因为我的系统上没有带有Mongo的NodeJS。

答案 1 :(得分:-2)

通常人们使用PUT方法来更新模型 检查mongodb文档中的update方法。

<强>路线

router.put('/api/teams/:teamid/player/:playerid', player.updatePlayer);

<强>控制器

module.exports = {
  updatePlayer: function(req, res) {
    models.Team.update({"players.player_name":"Jokim"}, {$set: {assist: 100}}, function(err, player) {
      if (err) {
        res.json({error: err});
      } else {
        console.log(player);
        res.json(player);    
      }
    });
  }
};