Мангуст: правильное проектирование реляционной схемы

Я пытаюсь установить некоторые реляционные данные между несколькими объектами в моей базе данных 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 Для отношений необходимы следующие функциональные возможности:

  1. user Можно CRUDvehicles к его 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'sgarage и используя их, чтобы соответствовать Vehicles.find({}) запрос.

  1. Администратор должен иметь возможность выполнить запрос, который может получить частоту _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 в частотную диаграмму.

  1. 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:

  1. Какова наилучшая практика для реализации значения <-> транспортного средства <-> гараж <-> пользовательские отношения?

  2. Как вернуть транспортные средства, хранящиеся в гараже, по ссылке?

  3. Как узнать частоту сохранения автомобилей в гаражах? (думать о гараже как список избранного.)

  4. Как я могу создать систему уведомлений с этими отношениями? (Уведомить пользователя об обновлении, например, this.sendEmail(user.email))

0 ответов

Другие вопросы по тегам