Mongodb保存到嵌套对象中?

时间:2014-05-05 18:38:44

标签: javascript node.js mongodb express

我无法将req.body插入我的mongodb集合中。

我有这个触发add方法的路由,我试图弄清楚将req.body保存到嵌套集合数组中的查询

router.post('/api/teams/:tid/players', player.add);

add: function(req, res) {
    var newPlayer = new models.Team({ _id: req.params.tid }, req.body);
    newPlayer.save(function(err, player) {
        if (err) {
            res.json({error: 'Error adding player.'});
        } else {
            console.log(req.body)
            res.json(req.body);
        }
    });
}

这是一个示例文档

[
   {
      "team_name":"Bulls",
      "_id":"5367bf0135635eb82d4ccf49",
      "__v":0,
      "players":[
         {
            "player_name":"Taj Gibson",
            "_id":"5367bf0135635eb82d4ccf4b"
         },
         {
            "player_name":"Kirk Hinrich",
            "_id":"5367bf0135635eb82d4ccf4a"
         }
      ]
   }
]

我无法弄清楚如何插入/保存类似

的POST req.body
{
    "player_name":"Derrick"
}

这样新的req.body现在被添加到players对象数组中。

我的问题是如何设置mongodb / mongoose查询来处理这个?

P.S 我显然收到错误消息,因为我认为查询无效,但这只是我想要做的事情。

这样的东西更合适,但仍然不起作用,但我猜是一个更好的例子

var newPlayer = new models.Team({ _id: req.params.tid }, { players: req.body });

1 个答案:

答案 0 :(得分:1)

如果您在Mongoose中创建了一个团队模型,那么您可以调用内置方法findOneAndUpdate

Team.findOneAndUpdate({ _id: req.params.tid }, 
                      { $addToSet: { players: req.body} }, 
                        function(err, doc){
                              console.log(doc);
                      });

您可以findOneupdate,然后save,但上述内容更直截了当。 $addToSet只会在数组中尚未存在相关特定更新时添加。您也可以使用$push

以上确实在很大程度上取决于你如何配置你的模型,以及你确实使用的是Mongoose(但显然你问过如何在Mongoose中完成它,所以我已经提供了它作为一种可能的解决方案)。

$addToSet的文件位于http://docs.mongodb.org/manual/reference/operator/update/addToSet/,相关操作如下:

db.collection.update( <query>, { $addToSet: { <field>: <value> } } );