Как узнать, является ли вложенный документ фактической подсхемой или просто объектом в Mongoose - PullRequest
0 голосов
/ 04 августа 2020

У меня следующая ситуация: я создаю функцию обновления общего назначения для своего проекта, которая принимает полезную нагрузку и проходит через нее, проверяя, существует ли свойство в полезной нагрузке в схеме модели, и если оно есть, оно присваивает новое значение свойства документу (обновляя его). Это делается также в поддокументах (рекурсивно). У меня есть настраиваемый тип Language для многоязычных строковых полей, который представляет собой объект, содержащий свойства в форме языка ('en', 'de', et c). Теперь, поскольку это настраиваемый тип, Mon goose не знает, было ли изменено его содержимое, поэтому я должен использовать для него markModified. И здесь возникает проблема: реальные подсхемы ведут себя здесь иначе, чем объекты. Если я вызываю markModified для подсхемы, он ожидает путь внутри этой подсхемы, а не всего документа. С другой стороны, если я вызываю markModified для объекта, он ожидает от родителя весь путь. Я не знаю, ошибка это или нет, но если я хочу поддерживать и то, и другое, мне нужно различать их в моей функции. Есть ли способ узнать, является ли это подсхема, созданная пользователем, или просто объект (который был преобразован в подсхему с помощью mon goose)?

Пример модели установки:

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

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

Пример code:

      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 голосов
/ 05 августа 2020

Вместе с коллегами мы выяснили, что объект не является фактической подсхемой, он называется nestedPath . Только вложенные пути имеют свойство $__isNested, подсхемы - нет. В результате из-за этой разной обработки двух случаев в nestedPaths нам нужно указать полный путь при использовании markModified, тогда как в подсхемах только путь внутри этой подсхемы

...