Мангуст: правильное проектирование реляционной схемы
Я пытаюсь установить некоторые реляционные данные между несколькими объектами в моей базе данных mongodb/monogoose, используя ссылки (сохранение идентификатора в свойствах). Я написал, что я реализовал, и мои недостатки. Это обширный пост, пожалуйста, посмотрите мой TL;DR, прежде чем читать все. Ответы высокого уровня с некоторым кодом также приемлемы.
У меня есть следующие схемы в моей базе данных Mongoose:
Пользователь:
UserSchema: {
_id: (MongoID)
isActive:
firstName:
lastName:
email:
phone:
role:
hash:
address:
}
Транспортное средство:
VehicleSchema: {
_id: (MongoID)
internal_id: (linking id)
metadata: (product name, product description)
}
Значение:
ValueSchema: {
_id: (MongoID)
internal_id: (linking id)
todayPrice: xxx.xx
history [ {...}, {...}, {...}]
}
каждый user
имеет garage
, место, где они могут хранить свои vehicles
типа VehicleSchema
, vehicle
<-> garage
Для отношений необходимы следующие функциональные возможности:
user
МожноCRUD
vehicles
к егоgarage
(один за раз).
предложение; добавить (C**D) следующее к UserSchema
:
garage: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Vehicle' }]
UserSchema.methods.addToGarage= function (id) {
if (this.garage.indexOf(id) === -1) {
this.garage.push(id);
}
return this.save();
};
UserSchema.methods.removeFromGarage= function (id) {
this.garage.remove(id);
return this.save();
};
UserSchema.methods.isInGarage= function (id) {
return this.garage.some(function (vehicleId) {
return vehicleId.toString() === id.toString();
});
};
У меня возникли проблемы с развитием "R" (читать) CRUD
для меня garage
, но у меня есть отправная точка:
UserSchema.methods.viewGarage= function (id) {
return this.garage; // only Ids? how do I include the actual document?
};
Я думал, может быть, используя _id
собственность транспортного средства в user's
garage
и используя их, чтобы соответствовать Vehicles.find({})
запрос.
- Администратор должен иметь возможность выполнить запрос, который может получить частоту
_id
изvehicle
вgarages
,
Запрос: получить все vehicles
от garages
из всех users
и считать частоту. Вернуть (отсортированный) массив vehicle
и раз в гараже.
отправная точка - используйте совокупный запрос:
User.aggregate([
{
$lookup:
{
from: "vehicle",
localField: "garage", // ?? attempt: garage.forEach()
foreignField: "_id",
as: "vehicle"
}
}
])
Здесь я застрял, собираясь из users --> users.garage[] --> vehicle --> vehicle.internal_id
и затем считая _ids
в частотную диаграмму.
vehicle
а такжеvalue
являются объектами, которые имеют одинаковыеinternal_id
пара ключ / значение. (эти объекты объединяются с использованием$lookup
Вот где это становится важным. Администратор может запустить скрипт, который обновляетValues
если есть изменение в цене:Values.find({}).then(docs => { docs.forEach(value => { request((myUrl, value) => { // update logic here if (update) { // if there is an update value.save(); // VALUE SCHEMA WAS UPDATED } }); }});
когда ValueSchema
обновляется -> Мне нужно уведомить каждого пользователя, что произошло изменение в значении. Для этого мне нужен список всех пользователей, которые имеют обновленный vehicle.internal_id
в их garage,
[ user -> garage[] -> vehicle <-> value] и сможете перебирать этот список. У меня проблемы с созданием этого списка пользователей, которые Value
от Vehicle
в их garage
был обновлен.
TL;DR:
Какова наилучшая практика для реализации значения <-> транспортного средства <-> гараж <-> пользовательские отношения?
Как вернуть транспортные средства, хранящиеся в гараже, по ссылке?
Как узнать частоту сохранения автомобилей в гаражах? (думать о гараже как список избранного.)
Как я могу создать систему уведомлений с этими отношениями? (Уведомить пользователя об обновлении, например, this.sendEmail(user.email))