Указание общей модели для наследования в схеме Mongoose

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

Я создаю приложение с использованием Mongoose и хотел бы иметь возможность выполнять следующее:

1) Модель Fridge содержит groceries поле, представляющее собой массив:

 var Fridge = mongoose.Schema({
    groceries: { type: [Grocery.schema] }
});
  

2) Grocery Модель является общей, которая будет наследоваться другими моделями:

 var grocerySchema = mongoose.Schema({
    name: { type: String }
});
var Grocery = mongoose.model("Grocery", grocerySchema);
  

3) Например, помидор — это продуктовый:

 var tomatoSchema = mongoose.Schema({
    size: { type: Number }
});
var Tomato = Grocery.discriminate("Tomato", tomatoSchema);
  

Теперь, если я создам экземпляр tomato и попытаюсь сохранить его в своем холодильнике, соответствующие Tomato атрибуты исчезнут, потому что (я предполагаю) холодильник ожидает, что Grocery поэтому сохраняются только Grocery атрибуты.

 var tomato = new Tomato({ name: "a big nice tomato", size: 20 });
fridge.groceries = [tomato];
fridge.save(...)
// now fridge === { groceries: [{ name: "a big nice tomato" }] }
// and not { groceries: [{ name: "a big nice tomato", size: 20 }] }
  

Я думаю, что это ожидаемое поведение Mongoose, и во многих отношениях это имеет смысл, но я бы предпочел не сохранять мою Groceries в отдельной коллекции и сохранять ссылки на нее в моей Fridge модели. Итак, я хотел бы, чтобы мой холодильник содержал экземпляры tomatoes, а не ссылки на Grocery объект в отдельной коллекции. Существует ли шаблон проектирования, который позволил бы мне это сделать?

Спасибо за ваш ответ. (P.S: из-за близости времени обеда вышеприведенным моделям были присвоены имена исключительно для примера!)

Ответ №1:

Я не думаю, что это возможно прямо сейчас. Вы правы, думая, что вам нужно сохранить tomato, который поместит ее в groceries , а затем вы сможете ссылаться на это из fridge .

Комментарии:

1. Это печально : ( Я пытаюсь придумать умный взлом, но тогда сохранение ссылок, возможно, будет проще…