首页 > 解决方案 > 如何使用 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 上成功结帐时,在相同的请求和访问数据库期间。

  1. 更新创建的订单 ( order.isPaid === true)

  2. 异步调用 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();
      }
    };
    
  3. 使用 userId 参数并迭代 orderItems 将用户添加到 order 中的每个 Run aka Order.orderItems

  4. /使用成功消息重定向到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]._idusers.runs[0]._id从哪里来?它们无法在任何其他集合中找到

Order.orderItems = [
                {
                    "_id": { "$oid": "5fa43b8624b3da0a5d02797e" }, 
                    "run": { "$oid": "5fa436adf1047f07cc1af8d1" },
                }
            ]
    
User.runs = [
                {
                    "_id": { "$oid": "5fa43b9124b3da0a5d02797f" }, 
                    "runId": { "$oid": "5fa436adf1047f07cc1af8d1" }
                }
            ]

  

标签: node.jsmongodbmongoose-schemamongoose-populate

解决方案


推荐阅读