如何找出嵌套文档是猫鼬的实际子模式还是对象

时间:2020-08-04 00:11:54

标签: node.js mongoose nested updating mixed

我有以下情况: 我正在为我的项目创建一个通用更新功能,该功能获取有效负载并对其进行遍历,检查有效负载中的属性是否存在于模型架构上,如果存在,它将为文档分配新的属性值(更新它)。它也在子文档中执行此操作(递归)。 我有一个用于多语言字符串字段的自定义类型的语言,它是一个包含语言形式的属性(“ en”,“ de”等)的对象。现在,由于其自​​定义类型,Mongoose不知道其内容是否已修改,因此我必须在其上使用markModified。问题来了:实际的子方案在这里的行为不同于对象。如果我在子模式中调用markModified,则它期望该子模式中的路径,而不是整个文档中的路径。另一方面,如果我在对象上调用markModified,则它期望来自父对象的完整路径。我不知道它是否是一个错误,但是如果我想同时支持这两个功能,则需要在函数中区分两者。有没有办法知道是用户创建的子模式还是仅仅是对象(由猫鼬转换为子模式)?

示例安装模型:

    const TestSchema = new Schema(
      {
        object: {
          name: {
            type: Language
          }
        },
        nestedSchema: {
          type: NestedTestSchema
        }
      }
    )

    const NestedTestSchema = new Schema(
      {
        name: {
          type: Language
        }
      }
    )

示例代码:

      const testDocument = new TestModel({
        object: {
          name: {
            en: 'NameEN',
            de: 'NameDE'
          }
        }
        nestedSchema: {
          name: {
            en: 'NameEN',
            de: 'NameDE'
          }
        }
      })

      // We make a payload to change these values

      const payload = {
        object: { // Update object
          name: {
            en: 'Name updated',
            fr: 'Something',
          }
        },
        nestedSchema: { // Update subschema
          name: {
            en: 'Name updated',
            fr: 'Something',
          }
        }
      }

现在,当我收到此信息并使用这些值更新文档时,对于对象我必须

const { object, nestedSchema } = document // This, of course, is useless here, I would get nestedSchema and object as argument in recursive function, its only for demonstration
nestedSchema.markModified('name.en') // Etc

对于对象我必须

object.markModified('object.name.en') // Etc

1 个答案:

答案 0 :(得分:0)

我们与同事一起发现对象不是实际的子模式,它称为nestedPath。只有nestedPaths具有属性$__isNested,子方案没有。结果,由于两种情况的处理方式不同,在nestedPaths中,当使用markModified时,我们需要指定完整路径;而在子计划中,则需要指定该子模式中的唯一路径