我定义了以下Schema:
var mongoose = require('mongoose');
var VenueSchema = new mongoose.Schema({
name: String,
email: String,
phone: String,
address: {address1: String, address2: String, suburb: String, state: String, postCode: Number, country: {type: String, default: 'Australia'}},
ABN: String,
website: String,
openingHours: [{order: Number, day: Date, open: String, close: String}],
closedDays: [{startDate: Date, endDate: Date}],
supportEmail: String
});
var Venue = mongoose.model('Venue', VenueSchema);
module.exports = Venue;
我在Express中定义了以下方法来保存文档:
app.post('/api/venues/:id', function (req, res) {
Venue.findOneAndUpdate({_id: req.params.id}, req.body, {upsert: true, new: true}, function (err, venue) {
if (err) {
res.status(500).send(err);
}
else {
res.status(200).json(venue);
}
});
});
问题是,当文档包含openingHours
数组时,生成的保存文档在mongo
控制台中显示如下:
"openingHours" : [
{
"_id" : ObjectId("563be68ce65bf8543c6ec5e0")
}
],
我可以确认,该对象正在传递给Express方法,因为req.body.openingHours
具有正确的长度和对象。显然正在发生一些事情,否则Mongo
将不会填充_id
文件,但是,我不明白为什么会发生这种情况。我没有为此定义单独的模式,它只是嵌入在doc中的对象数组。
我必须有一些简单的东西吗?
更新
如果我使用Express
方法将代码更改为以下内容:
Venue.update({_id: req.params.id}, req.body, {multi: true}, function (err, raw) {
if (err) {
res.status(500).send(err);
}
else {
Venue.findById(req.params.id, function(err, venue) {
if (err) {
res.status(500).send(err);
}
else {
res.status(200).json(venue);
}
});
}
});
然后我的mongo
控制台看起来像这样:
"openingHours" : [
{
"order" : 0,
"day" : "Monday",
"open" : "10:00",
"close" : "22:00",
"_id" : ObjectId("563bf15ac16e007832e025ae")
},
{
"order" : 1,
"day" : "Tuesday",
"open" : "10:00",
"close" : "22:00",
"_id" : ObjectId("563bf197c16e007832e025af")
},
{
"order" : 2,
"day" : "Wednesday",
"open" : "10:00",
"close" : "22:00",
"_id" : ObjectId("563bf19bc16e007832e025b0")
}
],
现在我不明白两件事:
1.为什么mongo
将嵌入在数组中的对象与普通的嵌入式对象区别对待?即,当您保存或更新时,嵌入的address
对象没有为其分配_id
字段。
2.为什么findOneAndUpdate
表现得如此不同?是因为{multi: true}
?