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

How to inserting a document with field referencing document in another collection

本文关键字:文档 字段 引用 引用文 插入 另一个 集合      更新时间:2023-09-26

我目前正在尝试为具有文档引用的模式创建一个.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'});
    });
});

为了创建董事会,我在请求中包含了boardname和用户名。使用用户名,我做了一个User。Find查找特定的用户并将其分配给board.userid。然而,这似乎并没有作为董事会工作。Userid未出现

任何帮助都将非常感激!

谢谢!

编辑

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

我相信你正在寻找人口

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

对不起,我之前解决了一个不同的问题。在某些情况下,您可能需要使用我提供的先前的解决方案,因此我将保留它。

回调

userid不在board文档上的原因是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'});
        });
    });   
});