Mongoose - вложенные вложенные документы, связанные с тем же типом - PullRequest
1 голос
/ 04 июня 2019

У меня есть следующая структура:

--> means is included in (as property):
Item --> ItemStack <--> Inventory

Item: name: string, weight: number, ...
ItemStack: item: Item, amount: number, inventory: Inventory | null
Inventory: items: ItemStack[], capacity: number

Предмет - это общее определение некоторого предмета.ItemStack имеет ссылку на элемент и количество этих элементов.Тем не менее, Предмет может быть рюкзаком, а рюкзак может иметь Инвентарь.Итак, ItemStack также имеет инвентаризацию в качестве вложенного документа.И тогда Inventory хранит массив ItemStacks.В этом проблема, поскольку ItemStack и Inventory не должны иметь своих собственных коллекций, так как они не находятся в отношениях «многие ко многим», поэтому лучше хранить их как вложенные документы.Здесь возникает проблема, поскольку это может рассматриваться как циклическая ссылка, которая, однако, никогда не может произойти.

Вот как это может выглядеть в действии (при извлечении из базы данных):

Item {
  id: 1,
  name: "Apple",
  weight: 1
}
Item {
  id: 2,
  name: "Backpack",
  weight: 10
}

InventoryHolder {
  Inventory {
    capacity: 10,
    items: [
      Item {
        id: 1,
        name: "Apple"
      },
      Item {
        id: 2,
        name: "Backpack",
        inventory: Inventory { // the point of circular reference
          items: [] // as many more items in backpacks as needed
        }
      }
    ]
  }
}

Однако, поскольку Инвентаризация может храниться или принадлежать только одному Держателю или Предмету, лучше всего хранить их как поддокументы.

Теперь моя проблема заключается в том, как определить модели для структуры, которая будет работать простовот так.

Заранее спасибо!

РЕДАКТИРОВАТЬ: я пытался работать с Typegoose, который позволяет мне определять классы для моделей.Вот как я пытался их настроить, используя их в качестве вложенных документов:

class TSItem extends Typegoose {
    @prop()
    name?: string;
    @prop()
    weight?: number;
    @prop()
    canHaveInventory?: boolean;
}

class TSItemStack extends Typegoose {
    @prop()
    item?: TSItem;
    @prop()
    inventory?: TSInventory;
    @prop()
    amount?: number;
}

class TSInventory {
    items?: TSItemStack[];
    capacity?: number;

    constructor(){
        this.items = [];
        this.capacity = 10;
    }
}

Однако при компиляции я, очевидно, получаю эту ошибку:

ReferenceError: TSInventory is not defined

... как яЯ пытаюсь использовать его, прежде чем он был определен.И это именно та проблема.Сами типы находятся в круговой взаимосвязи, однако при применении их с реальными данными этого никогда не произойдет.

1 Ответ

0 голосов
/ 06 июня 2019

Удалось просто использовать "Объект" в качестве типа для рекурсии / циклической ссылки.

Потребуется, чтобы я потом произвел некоторую приведение типов, но это работает!Кажется, я не могу решить проблему другим способом.

...