Mongoose:正确设计关系模式

时间:2017-08-04 15:58:24

标签: node.js mongodb mongoose mongoose-populate

我正在尝试使用引用(在属性中存储ID)在我的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可以CRUD vehiclesgarage(一次一个)。
  2. 建议;将以下内容添加(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的{​​{1}},但我有一个起点:

    garage

    我在考虑使用UserSchema.methods.viewGarage= function (id) { return this.garage; // only Ids? how do I include the actual document? }; _id中车辆的user's属性,并使用它们来匹配garage查询。

    1. 管理员应该能够运行一个查询,该查询可以在Vehicles.find({})中获得_id的{​​{1}}频率。
    2. 查询:从所有vehicle的{​​{1}}获取所有garages并计算频率。在车库中返回一个(已排序的)vehicles数组和时间。

      起点 - 使用聚合查询:

      garages

      我从users开始,然后将vehicle计入频率表。

      1. 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
      2. 更新$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, Value Vehicle garage的{​​{1}}用户列表已更新时遇到问题。

        TL; DR:

        1. 实施价值的最佳做法是< - >车辆< - >车库< - >用户关系?

        2. 如何通过参考方式退回存放在车库中的车辆?

        3. 如何获得车库中保存的汽车频率? (将车库视为收藏列表。)

        4. 如何使用这些关系创建通知系统? (通知更新用户,e.x。this.sendEmail(user.email))

0 个答案:

没有答案