如何使用嵌套层次结构更新嵌入式文档?

时间:2014-07-19 23:46:28

标签: javascript node.js mongodb mongoose

我有一个需要更新的嵌入式文档。除了一个场景之外,我已经成功地完成了所有工作:我无法获得具有嵌套层次结构的嵌入式文档以进行更新。以下是我尝试做的一个例子:

console.log('Phone type: ' + req.body.phone.type); // prints, e.g., 'Phone type: Work'
console.log('Phone #: ' + req.body.phone.number); // prints, e.g., 'Phone #: 555-555-5555'

var updateData = {
        "user.$.contact_info": {
            email: req.body.email,
            phone: {
                type: req.body.phone.type,
                number: req.body.phone.number
            }
        }
    };
    Group.update(
        { "user._id" : req.params.user_id },
        { $push : updateData },
        function(err,data) {
            console.log('Success!'); // I see the "Success!" message every time I save a record
        }
    );

架构:

var contactInfoSchema = mongoose.Schema({
    created : {
        type: Date,
        default: Date.now
    },
    email : String
    phone: {
        type: String,
        number: String
    }
});

var userSchema = mongoose.Schema({
    created : {
        type: Date,
        default: Date.now
    },
    contact_info : [contactInfoSchema]
});

var GroupSchema = mongoose.Schema({
    created : {
        type: Date,
        default: Date.now
    },
    users : [userSchema]
});

我发现我可以创建记录,但只存储电子邮件地址,而不是电话信息。检查控制台时,我可以看到正在发送电话类型和电话号码信息,但它不会在数据库中更新。我做错了什么?

1 个答案:

答案 0 :(得分:1)

使用“type”关键字在“contactInfoSchema”中出现的问题。你需要这个:

var contactInfoSchema = mongoose.Schema({
    created : {
        type: Date,
        default: Date.now
    },
    email : String
    phone: {
        "type": { "type": String },
        number: String
    }
});

所以基本上mongoose很困惑,因为你试图将“子文档”字段称为“类型”,并且它认为这是“电话”字段的数据“类型”。如上所述,一切正常。