将文档添加到文档(subdocs)不起作用

时间:2018-01-23 12:06:25

标签: node.js mongodb express mongoose

不幸的是,但mongoose中的子文档不起作用,我不知道原因:

...
mongoose.connect('mongodb://zzz@xxx.ccc.com:59676/zxcv');
var Schema = mongoose.Schema;
 
var entrySchema = Schema({
    title: String,
    img: String,
    info: String,
    link: String
}, {collection: 'xxx'});
 
var userDataSchema = Schema({
  name: String,
  password: { type: String, select: false},
  birth: Number,
  followers: [{ "name": String}],
  entry: [entrySchema]
}, {collection: 'yyy'});
 
var UserData = mongoose.model('UserData', userDataSchema);
var entry = mongoose.model('entry', entrySchema);
 
app.get('/:user', function(req, res) {
    UserData.findOne( {'name': req.params.user}, function(err, user) {
        if (err)
            res.send(err);
        res.json(user);
    });
});

此代码返回userDataSchema方案中的数据和空条目:[]。 我可以单独查询userDataSchema和entrySchema并返回正确的数据,但它不能一起工作。我在哪里弄错了? 默认情况下,我想动态地将所有集合(关注者中的名称)添加到我的架构中。

2 个答案:

答案 0 :(得分:1)

var entrySchema = new Schema({
                  ^^^
    title: String,
    img: String,
    info: String,
    link: String
});

修改:当您使用entrySchema声明{collection: 'xxx'}时,您强制mongoose创建名为xxx的separete集合,这就是您应该引用{的原因如chridam的回答所述,在entrySchema内{1}},或删除收集选项:userDataSchema

答案 1 :(得分:1)

您需要重新定义架构以使用 populate()

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

var entrySchema = Schema({
    title: String,
    img: String,
    info: String,
    link: String
}, {collection: 'xxx'});

var userDataSchema = Schema({
    name: String,
    password: { type: String, select: false },
    birth: Number,
    followers: [{ "name": String}],
    entry: [{ type: Schema.Types.ObjectId, ref: 'entry' }]
}, {collection: 'yyy'});


var UserData = mongoose.model('UserData', userDataSchema);
var entry = mongoose.model('entry', entrySchema);

app.get('/:user', function(req, res) {
    UserData.findOne({'name': req.params.user})
        .populate('entry')
        .exec(function(err, user) {
            if (err)
                res.send(err);
            res.json(user);
        });
});

这是有效的,因为您实际上已将entry模型的引用保存为_id集合中的userData

如需深入解释上述方法,请参阅docs