Mongoose模式中的嵌套对象

77

我在这里看到了很多关于这个问题的答案,但是我还是不明白(可能是因为它们使用了更“复杂”的例子)...... 所以我想做一个“客户”模式,它将有两个字段,这些字段将有嵌套的“子字段”,其他字段可能会重复。 这就是我的意思:

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

telemail可能是一个数组。地址不会重复,但有一些子字段,如您所见。

我该如何使其工作?

2个回答

134
const mongoose = require("mongoose");

// Make connection
// https://mongoosejs.com/docs/connections.html#error-handling
mongoose.connect("mongodb://localhost:27017/test", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// Define schema
// https://mongoosejs.com/docs/models.html#compiling
const AddressSchema = mongoose.Schema({
  city: String,
  street: String,
  houseNumber: String,
});

const ContactInfoSchema = mongoose.Schema({
  tel: [Number],
  email: [String],
  address: {
    type: AddressSchema,
    required: true,
  },
});

const CustomerSchema = mongoose.Schema({
  firstName: String,
  lastName: String,
  company: String,
  connectInfo: ContactInfoSchema,
});

const CustomerModel = mongoose.model("Customer", CustomerSchema);

// Create a record
// https://mongoosejs.com/docs/models.html#constructing-documents
const customer = new CustomerModel({
  firstName: "Ashish",
  lastName: "Suthar",
  company: "BitOrbits",
  connectInfo: {
    tel: [8154080079, 6354492692],
    email: ["asissuthar@gmail.com", "contact.bitorbits@gmail.com"],
  },
});

// Insert customer object
// https://mongoosejs.com/docs/api.html#model_Model-save
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
// https://mongoosejs.com/docs/api.html#model_Model.findOne
CustomerModel.findOne({ firstName: "Ashish" }, (err, cust) => {
  if (err) return console.error(err);

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

// Update inner record
// https://mongoosejs.com/docs/api.html#model_Model.update
CustomerModel.updateOne(
  { firstName: "Ashish" },
  {
    $set: {
      "connectInfo.tel.0": 8154099999,
    },
  }
);

1
我们如何为一个数组分配自定义类型,例如[地址]? - TheEhsanSarshar
您仍然可以为每个嵌套字段设置默认值。 - Renan Coelho
现在我该如何使用“required”来处理地址?@asissuthar - Vinita
1
请查看更新后的验证答案。@Vinita - asissuthar
当以这种方式存储contactInfo时,它会被分配_id。如果您想避免创建_id,请按照以下方法操作:https://dev59.com/LWQm5IYBdhLWcg3w4CXA - Denis B

16
// 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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接