Mongoose没有保存嵌入式对象数组

时间:2015-11-05 23:58:18

标签: javascript node.js mongodb express mongoose

我定义了以下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}

0 个答案:

没有答案