如何在另一个集合中插入带有字段引用文档的文档

时间:2014-06-26 04:32:53

标签: javascript node.js mongodb express mongoose

我目前正在尝试为包含文档引用的架构创建.post函数。但是,我不确定如何从另一个集合中检索文档引用的ObjectID。

Board.js

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var BoardSchema   = new Schema({
boardname: String,
userid: {type: Schema.ObjectId, ref: 'UserSchema'}
});

module.exports = mongoose.model('Board', BoardSchema);

user.js的

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var UserSchema   = new Schema({
    username: String
});

module.exports = mongoose.model('User', UserSchema);

routes.js

router.route('/boards')

.get(function(req, res) {
    Board.find(function(err, boards) {
        if(err)
            res.send(err);

        res.json(boards);
    });
})

.post(function(req, res) {

    var board = new Board();
    board.boardname = req.body.boardname;

    User.find({username: req.body.username}, function(err, user) {
        if(err)
            res.send(err);

        board.userid = user._id;
    });

    board.save(function(err) {
        if(err)
            res.send(err);

        res.json({message: 'New Board created'});
    });
});

要创建电路板,我在请求中包含电路板名称和用户名。使用用户名,我执行User.find查找特定用户并将其分配给board.userid。但是,这似乎不起作用,因为board.userid不会出现。

非常感谢任何帮助!

谢谢!

修改

对所需内容的更好解释是我有一个现有的User集合。当我想向Board添加一个新文档时,我会提供一个用户名,我将从中搜索User集合,获取特定用户的ObjectId并将其作为userid添加到Board文档中。

1 个答案:

答案 0 :(得分:0)

<击> 我相信你正在寻找population

  

MongoDB中没有连接,但有时我们仍然需要引用   到其他馆藏的文件。这就是人口涌入的地方。

尝试这样的事情:

//small change to Board Schema
var BoardSchema   = new Schema({
   boardname: String,
   user: {type: Schema.ObjectId, ref: 'User'}
});


//using populate
Board.findOne({ boardName: "someBoardName" })
   .populate('user') // <--
   .exec(function (err, board) {
      if (err) ..
      console.log('The user is %s', board.user._id);
      // prints "The user id is <some id>"
   })

<击>

抱歉,我之前解决了另一个问题。你可能想要使用我在某些时候提供的prevoius解决方案,所以我就离开了。

<强>回调

用户标识不在电路板文档上的原因是User.find是异步的,并且在调用board.save(...)时未分配。res.send(...)

这应该可以解决问题:

(另外,我添加了几个返回以防止在.post(function(req, res) { var board = new Board(); board.boardname = req.body.boardname; User.find({username: req.body.username}, function(err, user) { if(err) return res.send(err); //<-- note the return here! board.userid = user._id; board.save(function(err) { if(err) return res.send(err); //<-- note the return here! res.json({message: 'New Board created'}); }); }); });

之后执行
{{1}}