在mongoose中更新嵌套模式

时间:2015-06-23 14:06:23

标签: node.js mongodb mongoose

我在发票架构中有一个嵌套的项目架构,如下所示:

var InvoiceSchema = new db.Schema({
  title: {
    type: String,
    required: true
  },
  description: String,
  clientId: db.Schema.ObjectId,
  companyId: db.Schema.ObjectId,
  poNumber: Number,
  invoiceNumber: {
    type: Number,
    default: 1000
  },
  taxApplied: {
    type: Boolean,
    default: false
  },
  feeApplied: {
    type: Boolean,
    default: false
  },
  lastUpdated: {
    type: Date,
    default: Date.now
  },
  createdOn: {
    type: Date,
    default: Date.now
  },
  status: {
    type: String,
    enum: ['presented', 'entered', 'hold', 'paid',
      'partially paid', 'reversed', 'void'],
    required: true
  },
  invoiceItems: [InvoiceItemSchema]
});



var InvoiceItemSchema = new db.Schema({
  invoiceId: {
    type: db.Schema.ObjectId,
    required: true
  },
  description: String,
  qty: Number,
  rate: Number,
  isFlatFee: {
    type: Boolean,
    default: false
  }
});

我可以创建一个新的invoiceItem并将其直接推送到invoice invoiceItems数组中,并在其中读取它,但我在尝试更新和删除时遇到了很多麻烦。我在这里看这个网站

http://tech-blog.maddyzone.com/node/add-update-delete-object-array-schema-mongoosemongodb

但我似乎无法将其中任何一种工作。

我知道在那篇博客中他使用 $ set 来更新内容,但看起来它只更新了一个字段,我想根据用户输入而不是硬编码字段更新任何字段。我现在没有任何代码可以展示,因为我很遗憾但是会得到一些帮助!

1 个答案:

答案 0 :(得分:0)

如果您对InvoiceItem中的发票有提及,则您不应该将项目保存在发票的列表中。如果你想获得该列表,你可以简单地进行如下查询:

InvoiceItem.find({invoiceId: invoiceId}, function(err, items) {
   ...
})

现在这将使更新变得更加容易,因为您只需更新每个InvoiceItem对象并保留对Invoice的引用。

希望这能帮到你。