单个嵌套子文件Mongoose

时间:2017-04-14 11:02:00

标签: node.js mongoose

我正在尝试将一个子文档嵌入到我的主文档中,如下所示:

这是主要的文件.js

var mongoose = require('../../db/mongodb.connector'),
    Schema   = mongoose.Schema;

require('./document.model');
var Document= mongoose.model('Document');
require('./alert.model');
var Alert = mongoose.model('Alert');

    var userSchema = new Schema({
        name:        { type: String }  
        created:     { type: Date, default: Date.now()},
        alerts:      {type: Schema.ObjectId,ref: 'Alert'},
        documents:   [{type: Schema.ObjectId,ref: 'Document'}],

    });

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

这是embed document.js

var mongoose = require('../../db/mongodb.connector'),
    Schema   = mongoose.Schema;


var alertsSchema  = new Schema({
    push:               {type: String, default: "true"},
    email:              {type: String, default: "false"},
    sms:                {type: String, default: "false"}
});

module.exports = mongoose.model('Alert', alertsSchema);

当我插入这样的新用户文档时:

exports.insertUser = function (userData, res) {

        var user = new User({
            name: userData.name,
            alerts: {push: "true", email:"false", sms: "false"}

        });

        user.save...

...

返回的数据是:

{ name: 'name',
  documents: [],
  created: 2017-04-14T10:22:05.612Z
}

问题是我不知道我是否正确执行了嵌入文档的sintax,因为插入不会返回任何错误,但警报对象不会出现在插入的新文档中。

会出现什么问题?

2 个答案:

答案 0 :(得分:2)

你做错了。您需要先保存警报文档,然后在用户文档中使用其ID。

let alertDoc = await new Alert({push: "true", email:"false", sms: "false"}).save();

// now use the id in the user doc
await new User({name: userData.name,alerts: alertDoc._id }).save()

如果您想嵌入整个文档而不是仅存储ref。您可以修改用户模型的架构。像这样定义你的架构。

var alertsSchema  = new Schema({
    push:               {type: String, default: "true"},
    email:              {type: String, default: "false"},
    sms:                {type: String, default: "false"}
});
....

var userSchema = new Schema({
    name:        { type: String }  
    created:     { type: Date, default: Date.now()},
    alerts:      alertsSchema,
    documents:   [{type: Schema.ObjectId,ref: 'Document'}],
});
....

// now this should work
var user = new User({
    name: "<some name>",
    alerts: {push: "true", email:"false", sms: "false"}
});

答案 1 :(得分:0)

userSchema中存在一个小问题。从您的架构定义中,您似乎只想存储对alertsdocuments的引用。这里正确的语法是alerts: {type: Schema.Types.ObjectId,ref: 'Alert'}。请注意其中包含额外的类型

此处的另一个问题是,您尝试在alert文档中存储完整的user对象。 Mongoose不能允许这样做,就像在你的模式中一样,你告诉mongoose只保存对alert文档的引用。因此,您需要在此处创建一个alert文档,获取它_id,然后将其存储在alert文档的user字段中。

每当您想要获取完整的用户架构时,您都可以populate alertdocuments

希望这个答案能够帮助您理解猫鼬模式的工作原理。