Mongoose不保存embedded式对象数组

我有以下架构定义:

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文件填充,但是,我不明白为什么这是甚至发生。 我还没有为此定义一个单独的模式,它只是embedded在文档中的一个对象数组。

必须有一些简单的东西我失踪了?

更新如果我将我的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") } ], 

现在我不明白2件事情:1.为什么mongo将对象embedded到数组中的方式不同于普通的embedded对象? 即,保存或更新时,embedded的address对象没有指定给它的_id字段。 2.为什么findOneAndUpdate行为如此不同? 是因为{multi: true}吗?