【问题标题】:MongoDB data structure for users with different inventories不同库存用户的MongoDB数据结构
【发布时间】:2020-03-20 15:08:18
【问题描述】:

我想做一个小型的全栈家庭项目。如果项目进展顺利,我想在申请工作时将其添加到我的投资组合中。我的计划是使用 MERN 堆栈构建一个网络应用程序,用户可以在其中创建自己的登录信息,存储他们拥有的花以及需要多久浇一次花。下一步是制定浇水时间表。

我刚刚开始使用 mongoDB。我想知道如何最好地构建数据,因为不同的用户应该可以访问他们自己的花。

是否可以在同一个 MongoDB 文档中同时包含鲜花和关联用户?

是否可以链接类似于 SQL 数据库的文档?

以下是我使用第一种替代方法的方法:

{
  name: "Joe Flowerman",
  flowers: [
    {
      name: "Freesia",
      water_freq_month: 4
    },
    {
      name: "Boat orchid",
      water_freq_month: 8
    }
  ]
}

我不确定这是否是此类数据的最佳使用方式,所以我欢迎任何意见。

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    这两个选项都是可能的。

    如果你需要显示用户和他们的花朵,在用户内部嵌入花朵就可以了。

    但如果您需要显示所有鲜花,最好将鲜花保存在单独的文档中。

    假设您不需要显示所有花朵,并选择嵌入。

    您可以为用户创建以下猫鼬模式:

    const mongoose = require("mongoose");
    
    const userSchema = new mongoose.Schema({
      name: {
        type: String,
        required: true
      },
      flowers: [
        new mongoose.Schema({
          name: {
            type: String,
            required: true
          },
          water_freq_month: {
            type: Number,
            required: true
          }
        })
      ]
    });
    
    module.exports = mongoose.model("User", userSchema);
    

    您可以向用户添加鲜花,并使用以下代码获取用户信息:

    const router = require("express").Router();
    
    const User = require("../models/user");
    
    router.post("/users/flowers", async (req, res) => {
      const loggedUserId = "5ddbcaaf7b9b9c4b986f9e89";
    
      const { name, water_freq_month } = req.body;
    
      const result = await User.findByIdAndUpdate(
        loggedUserId,
        {
          $push: {
            flowers: { name, water_freq_month }
          }
        },
        { new: true }
      );
    
      res.send(result);
    });
    
    router.get("/users/flowers", async (req, res) => {
      const loggedUserId = "5ddbcaaf7b9b9c4b986f9e89";
    
      const user = await User.findById(loggedUserId);
    
      res.send(user);
    });
    
    module.exports = router;
    

    当我们向用户添加两朵花时,当我们得到用户时,响应将是这样的:

    {
        "_id": "5ddbcaaf7b9b9c4b986f9e89",
        "name": "Joe Flowerman",
        "flowers": [
            {
                "_id": "5ddbcacc1640bf4b10f985cb",
                "name": "Freesia",
                "water_freq_month": 4
            },
            {
                "_id": "5ddbcafba209c91b5cbf3b4c",
                "name": "Boat orchid",
                "water_freq_month": 8
            }
        ],
        "__v": 0
    }
    

    【讨论】:

    • 谢谢!在那种情况下,我认为嵌入会起作用,因为我只希望登录用户看到他们自己的花。 :)
    • 是的,在这种情况下嵌入就可以了。
    • @ZeGeR 我添加了嵌入解决方案的代码示例,如果您觉得有帮助,请考虑接受答案。如果您不知道如何接受答案,您可以在这里查看stackoverflow.com/help/someone-answers
    【解决方案2】:

    如果你想处理这种类型的结构那么你必须使用 2 Collection

    用户喜欢 1,鲜花(库存)喜欢 2

    {
        "_id":ObjectId("5ddbcaaf7b9b9c4b986f9e89"),
        "name": "Joe Flowerman",
        "flowers": 
      [ObjectId('5ddbcaaf7b9b9c4b986f9e42'),ObjectId('5ddbcaaf7b9b9c4b986f9e43')]
        }
    

    - 花集合

     {
              "_id": ObjectId('5ddbcaaf7b9b9c4b986f9e42'),
               "name": "Freesia",
               "water_freq_month": 4
     },
    {
              "_id": ObjectId('5ddbcaaf7b9b9c4b986f9e43'),
               "name": "Boat orchid",
               "water_freq_month": 8
     }
    

    如果你可以使用这种类型的结构,那么数据冗余可以被删除

    当您要检索数据时,请使用简单的聚合查询

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 2013-08-20
      • 2011-01-06
      相关资源
      最近更新 更多