我正在尝试将一个子文档嵌入到我的主文档中,如下所示:
这是主要的文件.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,因为插入不会返回任何错误,但警报对象不会出现在插入的新文档中。
会出现什么问题?
答案 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
中存在一个小问题。从您的架构定义中,您似乎只想存储对alerts
和documents
的引用。这里正确的语法是alerts: {type: Schema.Types.ObjectId,ref: 'Alert'}
。请注意其中包含额外的类型。
此处的另一个问题是,您尝试在alert
文档中存储完整的user
对象。 Mongoose不能允许这样做,就像在你的模式中一样,你告诉mongoose只保存对alert
文档的引用。因此,您需要在此处创建一个alert
文档,获取它_id,然后将其存储在alert
文档的user
字段中。
每当您想要获取完整的用户架构时,您都可以populate alert
和documents
。
希望这个答案能够帮助您理解猫鼬模式的工作原理。