更新猫鼬中的嵌套模式[重复]

Posted

技术标签:

【中文标题】更新猫鼬中的嵌套模式[重复]【英文标题】:Updating nested schema in mongoose [duplicate] 【发布时间】:2015-09-09 09:16:28 【问题描述】:

我在发票模式中有一个嵌套项目模式,如下所示:

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】:

如果您从 InvoiceItem 中引用了 Invoice,则实际上不需要将项目保存在 Invoice 的列表中。如果您想获得该列表,您可以简单地执行如下查询:

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

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

希望这对您有所帮助。

【讨论】:

这个想法是有一个包含所有发票项目的发票文档。既然没有发票项目可以存在于发票之外,为什么要创建一个单独的发票项目文档(我认为这就是你的建议)? 因为它比将它们放在数组中更容易维护,就像说的那样,能够更新列表中的特定项目是一种痛苦。此解决方案不应被视为存在于发票之外,它应始终具有对发票的必需引用,并且您可以使用标准 mongoose 函数来访问它。.. 但我认为 NoSQL DB 背后的整个想法是将所有信息以可检索的格式与传统的关系数据库分开。我不反对你的建议,我只是认为它违背了 NoSQL DB 的优势。 当然,我同意,但我也倾向于远离过于复杂的模式。我会经常使用嵌套字典,因为您可以轻松访问和查询它们,但是如果您愿意,我通常会使用“关系模式”来更新内容并访问它。如果数组只包含字符串或简单的字典,我会让它属于模式。

以上是关于更新猫鼬中的嵌套模式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将相同的模式引用为猫鼬中的类型[重复]

如何通过猫鼬中的嵌套属性查找

如何在猫鼬中更新嵌套数组值

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

使用数组过滤器更新多个嵌套数组在猫鼬中不起作用

按猫鼬中的引用属性过滤[重复]