mongoose模式中的嵌套对象

时间:2016-09-20 14:20:32

标签: node.js mongodb mongoose-schema

我在这里看到了很多关于这个问题的答案,但我仍然没有得到它(也许是因为他们使用了更多"复杂的"例子)...... 所以我想要做的是一个" Customer"的模式,它将有两个字段,它们将嵌套"子字段",以及其他可能重复的字段。这就是我的意思:

let customerModel = new Schema({
    firstName: String,
    lastName: String,
    company: String,
    contactInfo: {
        tel: [Number],
        email: [String],
        address: {
            city: String,
            street: String,
            houseNumber: String
        }
    }   
});

tel 电子邮件可能是一个数组。 和地址不会重复,但你可以看到一些子字段。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:16)

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test');

var CustomerModel = mongoose.model('CustomerModel', {
    firstName: String,
    lastName: String,
    company: String,
    connectInfo: {
        tel: [Number],
        email: [String],
        address: {
            city: String,
            street: String,
            houseNumber: String
        }
    }
});

//create a record
var customer = new CustomerModel({
    firstName: 'Ashish',
    lastName: 'Suthar',
    company: 'asis',
    connectInfo: {
        tel: [12345,67890],
        email: ['me@a.com','you@a.com'],
        address: {
            city: 'x',
            street: 'y',
            houseNumber: 'x-1'
        }
    }
});

//insert customer object
customer.save((err,cust) => {
    if(err) return console.error(err);

    //this will print inserted record from database
    //console.log(cust);
});


// display any data from CustomerModel
CustomerModel.findOne({firstName:'Ashish'}, (err,cust) => {
    if(err) return console.error(err);

    //to print stored data
    console.log(cust.connectInfo.tel[0]); //output 12345
});


//update inner record
CustomerModel.update(
    {firstName: 'Ashish'},
    {$set: {"connectInfo.tel.0": 54320}}
    );

答案 1 :(得分:4)

// address model
    var addressModelSchema = new Schema({
                city: String,
                street: String,
                houseNumber: String})
    mongoose.model('address',addressModelSchema ,'address' )

// contactInfo model
       var contactInfoModelSchema = new Schema({
             tel: [Number],
            email: [String],
            address : {
                  type : mongoose.Schema.Type.ObjectId,
                  ref:'address'
                      }
              })
    mongoose.model('contactInfo ',contactInfoModelSchema ,'contactInfo ')

// customer model
    var customerModelSchema = new Schema({
        firstName: String,
        lastName: String,
        company: String,
      contactInfo : {
    type : mongoose.Schema.Type.ObjectId,
    ref:'contactInfo '
    }  
    });
    mongoose.model('customer',customerModelSchema ,'customer')

//add new address then contact info then the customer info
// it is better to create model for each part.