首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对不同库存的用户的MongoDB数据结构

针对不同库存的用户的MongoDB数据结构
EN

Stack Overflow用户
提问于 2019-11-25 18:40:18
回答 2查看 161关注 0票数 1

我想做一个小型的全栈home项目。如果项目结果良好,我想在申请工作时将其添加到我的投资组合中。我的计划是使用MERN堆栈来构建一个web应用程序,用户可以在其中创建自己的登录帐户,存储他们拥有的鲜花以及他们需要浇水的频率。创建浇水计划将是下一步。

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

有没有可能在同一个MongoDB-document中同时包含flowers和相关的用户?

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

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

代码语言:javascript
复制
{
  name: "Joe Flowerman",
  flowers: [
    {
      name: "Freesia",
      water_freq_month: 4
    },
    {
      name: "Boat orchid",
      water_freq_month: 8
    }
  ]
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-25 19:10:27

这两种选择都是可能的。

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

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

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

您可以为user创建以下mongoose模式:

代码语言:javascript
复制
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);

您可以将flowers添加到用户中,并使用flowers获取用户信息,代码如下:

代码语言:javascript
复制
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;

当我们向用户添加两朵花时,当我们获得用户时,响应将如下所示:

代码语言:javascript
复制
{
    "_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
}
票数 1
EN

Stack Overflow用户

发布于 2019-11-25 21:03:37

如果要处理这种类型的结构,则必须使用2集合

如1代表用户,2代表鲜花(库存)

代码语言:javascript
复制
{
    "_id":ObjectId("5ddbcaaf7b9b9c4b986f9e89"),
    "name": "Joe Flowerman",
    "flowers": 
  [ObjectId('5ddbcaaf7b9b9c4b986f9e42'),ObjectId('5ddbcaaf7b9b9c4b986f9e43')]
    }

FlowerCollection

代码语言:javascript
复制
 {
          "_id": ObjectId('5ddbcaaf7b9b9c4b986f9e42'),
           "name": "Freesia",
           "water_freq_month": 4
 },
{
          "_id": ObjectId('5ddbcaaf7b9b9c4b986f9e43'),
           "name": "Boat orchid",
           "water_freq_month": 8
 }

如果您可以使用这种类型的结构,则可以删除数据冗余

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59029900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档