node.js - 如何使用 Mongoose 和 MongoDB 自动交叉填充集合?
问题描述
情况:
我有一个由 3 个集合组成的简单数据库:用户、运行、订单。订单包含运行〜orderItems〜,用户可以一次购买多个运行。
我的主要问题:
当我更新我的order.isPaid === true
,是否有可能使用 MongoDB 自动交叉填充我的集合。我想填充我目前正在传递的相同字段。
以下是实际行为:
order.orderItems = [{runObj}]
user.runs = [{runId}]
run.users = [{userObj}]
const orderSchema = mongoose.Schema({
orderItems: [
{
name: { type: String, required: true },
location: { type: String, required: true },
date: { type: String, required: true },
price: { type: Number, required: true },
run: {
type: mongoose.Schema.Types.ObjectId,
required: true,
ref: "Run",
},
},
],
})
const runSchema = mongoose.Schema({
users: [
{
userId: {
type: mongoose.Schema.Types.ObjectId,
required: true,
ref: "User",
},
username: {
type: String,
required: true,
},
profilePhoto: {
type: String,
},
},
]
})
const userSchema = mongoose.Schema({
runs: [
{
runId: {
type: mongoose.Schema.Types.ObjectId,
required: true,
ref: "Run",
},
},
],
})
以下功能有效,但我想更好地了解我的模式/模型和参考发生了什么。
在 Stripe 上成功结帐时,在相同的请求和访问数据库期间。
更新创建的订单 (
order.isPaid === true
)异步调用 updateRunsAndUser(orderItems, userId)
const updateRunsAndUser = async (orderItems, userId) => { const user = await User.findById(userId); for (let i = 0; i < orderItems.length; i++) { const item = orderItems[i]; const run = await Run.findById(item.run); const runId = run._id; user.runs.push({ runId }); run.users.push({ userId, username: user.username, profilePhoto: user.profilePhoto, }); await user.save(); await run.save(); } };
使用 userId 参数并迭代 orderItems 将用户添加到 order 中的每个 Run aka Order.orderItems
/
使用成功消息重定向到order.isPaid == true
,添加用户以运行,运行也包含用户。
结果行为:(消除不相关对象的属性):
sampleOrderAfterCheckout = {
"_id": { "$oid": "5fa43b8624b3da0a5d02797d" },
"orderItems": [
{
"_id": { "$oid": "5fa43b8624b3da0a5d02797e" },
"run": { "$oid": "5fa436adf1047f07cc1af8d1" },
"name": "Wednesday Night Run",
"price": 10,
"location": "The Post",
"date": "11-04-2020"
}
],
}
sampleRunAfterCheckout = {
"_id": { "$oid": "5fa436adf1047f07cc1af8d1" },
"users": [
{
"_id": { "$oid": "5fa43b9124b3da0a5d027980" },
"userId": { "$oid": "5fa436adf1047f07cc1af8cd" },
"username": "merkyoass"
},
],
}
sampleUserAfterCheckout = {
"_id": { "$oid": "5fa436adf1047f07cc1af8cd" },
"isAdmin": true,
"username": "merkyoass",
"runs": [
{
"_id": { "$oid": "5fa43b9124b3da0a5d02797f" },
"runId": { "$oid": "5fa436adf1047f07cc1af8d1" }
}
],
}
在所有 3 个文档中找到 runId,
Order.orderItems[0].run === 5fa436adf1047f07cc1af8d1
1.orderObj,2.runObj,
run._id === 5fa436adf1047f07cc1af8d1
3.userObj,
user.runs[0].runId === 5fa436adf1047f07cc1af8d1
我的主要问题之一是Order.orderItems[0]._id
,users.runs[0]._id
从哪里来?它们无法在任何其他集合中找到
Order.orderItems = [
{
"_id": { "$oid": "5fa43b8624b3da0a5d02797e" },
"run": { "$oid": "5fa436adf1047f07cc1af8d1" },
}
]
User.runs = [
{
"_id": { "$oid": "5fa43b9124b3da0a5d02797f" },
"runId": { "$oid": "5fa436adf1047f07cc1af8d1" }
}
]
解决方案
推荐阅读
- mysql - 如何在MYSQL中从一行中计算点
- python - 为什么我的变量没有被访问?以及为什么我的输出集中在一起而不是在新行中返回
- python - 如何使用 opencv-python 创建搅拌机
- asn.1 - ASN.1 *STRING 字段的长度可以为零吗?
- java - 带有 UI 的服务器客户端,UI 上的标签未使用方法更新
- java - 来自 CompletableFuture 执行的意外空值
- xquery - 在 Xquery 中生成一个随机的十六进制数
- numpy - 使用 numpy 中的查找值进行数组操作
- sql - 我的左外连接在 postgresql 中不起作用
- c# - 我无法连接到 OPC 服务器