Мое приложение в настоящее время имеет сложную ситуацию, которая вызывает у меня всевозможные проблемы. В рамках приложения мы создаем рецепты, а рецепты состоят из ингредиентов (здесь их просто называют «продукты», потому что их также можно использовать самостоятельно). У нас есть коллекция рецептов stati c и один из динамических рецептов c ("пользователь"), которые копируются из версии stati c при связывании с пользователем. Технически все эти рецепты живут в одной коллекции, но используют дискриминатор.
Однако для продуктов питания у нас есть база данных, которую мы приобрели у третьей стороны, но нам также может потребоваться добавить наши собственные продукты. Поскольку обновления из сторонней базы данных, возможно, должны перезаписывать эту базу данных, нам необходимо отделять продукты от третьих лиц от продуктов, которые мы создаем. Итак, здесь нам нужны две совершенно разные коллекции, которые мы будем называть «foodsTP» и «foodsAdmin». Однако, поскольку они должны функционировать точно так же с точки зрения пользователя, мы не хотим, чтобы интерфейс заботился о том, из какой коллекции поступают продукты.
При получении продуктов напрямую это не проблема. У нас есть виртуальный получатель рецепта, который объединяет продукты из обеих коллекций:
RecipeBaseSchema.virtual('foods').get(function get() {
return this.foodsTP.concat(this.foodsAdmin);
});
Однако, как только продукты были добавлены в рецепт, запросы API на получение рецепта неправильно заполняют информацию о продуктах питания. , Я видел этот документ о виртуальном населении, но, похоже, он мне здесь не нужен. Мой виртуал здесь не просто ссылка на одну другую коллекцию, он активно объединяет ссылки на две другие коллекции. Когда мы вытащим этот объединенный набор продуктов, мы сможем получить всю информацию о продуктах из обеих коллекций. Тем не менее, это ошибка, которую я получаю в консоли:
Если вы заполняете виртуальный, вы должны установить опции localField и foreignField
Есть ли способ, которым я можно сделать это с моим объединенным виртуальным массивом?
РЕДАКТИРОВАТЬ: Вот упрощенная схема рецепта.
const RecipeBaseSchema = new Schema({
name: {
type: String,
required: true,
},
foodsTP: [{
quantity: {
type: Number,
default: 1,
},
measureUnit: String,
food: {
type: Schema.Types.ObjectId,
ref: 'Food',
},
}],
foodsAdmin: [{
quantity: {
type: Number,
default: 1,
},
measureUnit: String,
food: {
type: Schema.Types.ObjectId,
ref: 'FoodAdmin',
},
}],
dateAdded: Date,
dateModified: Date,
},
{
toJSON: { virtuals: true },
toObject: { virtuals: true },
}); // options
const RecipeUserSchema = new Schema({});
const RecipeAdminSchema = new Schema({});
Запрос API:
export function getRecipeUser(params) {
params.populate = [
{
path: 'foods',
populate: { path: 'food' },
},
];
params.query = {
_id: params.recipeId,
};
return apiCall('get', `/recipeuser`, omit(params, ['recipeId'])).then(
recipesUser => {
console.log(recipesUser);
return recipesUser[0];
}
);
}