我正在尝试使用引用(在属性中存储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
关系需要以下功能:
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
的{{1}},但我有一个起点:
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
的{{1}}频率。 查询:从所有vehicle
的{{1}}获取所有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,
Value
Vehicle
garage
的{{1}}用户列表已更新时遇到问题。
TL; DR:
实施价值的最佳做法是< - >车辆< - >车库< - >用户关系?
如何通过参考方式退回存放在车库中的车辆?
如何获得车库中保存的汽车频率? (将车库视为收藏列表。)
如何使用这些关系创建通知系统? (通知更新用户,e.x。this.sendEmail(user.email))