如何将 link 项发送给 mongodb 中的特定用户

how to link items to specific users in mongodb

所以我正在尝试制作第一个全栈应用程序,我有一个与数据库相关的问题,这似乎是最好的提问地点。所以在我的用户需要创建帐户,然后他们有一个 "cookbook" 这是一个食谱列表,每周从中随机选择并发送到他们的电子邮件中。将食谱与其各自的用户相关联的最佳方式是什么?我构建了一个简单的 MongoDB 后端,但在其中,食谱和用户保存在不同的地方。我正在考虑通过为菜谱的创建者提供 UUID 将菜谱链接到用户,但我也希望用户能够共享他们的菜谱并让其他人将该菜谱添加到他们的 "cookbook"。有没有一种方法可以让数据库中的每个用户都有一个食谱数组,并在他们创建一个食谱或添加其他人的食谱时将食谱添加到数组中,或者有更好的方法吗?

这是我的简单 mongodb 后端

的代码

食谱保存在数据库中

const router = require("express").Router();
let Recipe = require("../models/recipe.model");

router.route("/").get((req, res) => {
    Recipe.find()
    .then(rec => res.json(rec))
    .catch(err => res.status(400).json("Error: "+err))
})

router.route("/add").post((req, res) => {
    const name = req.body.name;
    const description = req.body.description;
    const imageLink = req.body.imageLink || "";
    const ingredients = Array.from(req.body.ingredients);
    const steps = Array.from(req.body.steps);
    const isPrivate = Boolean(req.body.private);

    const newRecipe = new Recipe({
        name,
        description,
        imageLink,
        ingredients,
        steps,
        isPrivate
    });

    newRecipe.save()
        .then(() => res.json("Recipe added"))
        .catch(err => res.status(400).json("Error: " + err))
})

router.route("/:id").get((req, res) => {
    Recipe.findById(req.params.id)
    .then(rec => res.json(rec))
    .catch(err => res.status(400).json("Error: "+err))
})

router.route("/:id").delete((req, res) => {
    Recipe.findByIdAndDelete(req.params.id)
    .then(() => res.json("Recipe Deleted"))
    .catch(err => res.status(400).json("Error: " + err))
})

router.route("/update/:id").post((req, res) => {
    Recipe.findById(req.params.id)
    .then(rec => {
        rec.name = req.body.name;
        rec.description = req.body.description;
        rec.imageLink = req.body.imageLink;
        rec.ingredients = Array.from(req.body.ingredients);
        rec.steps = Array.from(req.body.steps);
        rec.isPrivate = Boolean(req.body.isPrivate);

        rec.save()
        .then(() => res.json("Recipe updated"))
        .catch(err => res.status(400).json("Error: "+err))
    })
    .catch(err => res.status(400).json("Error: " + err))
})


module.exports = router

并将用户保存到数据库中

const router = require("express").Router()
let User = require("../models/user.model")

router.route("/").get((req, res) => {
    User.find()
      .then(users => res.json(users))
      .catch(err => res.status(400).json("Error: "+err));
});

router.route("/add").post((req, res) => {
    const username = req.body.username;
    const email = req.body.email;
    const newUser = new User({username, email})

    newUser.save()
    .then(() => res.json("User added"))
    .catch(err => res.status(400).json("Error: "+err))
})

module.exports = router

@david 我认为问题是关于在用户集合中嵌入或引用食谱。 如果我的理解是正确的,那么'MongoDB relationships: embed or reference?'可以帮助你,它很好地回答了这个问题。

  1. 鼓励嵌入而不是引用,以防文档大小预计不会超过 16 MB。因为这就是 NoSql 数据库的意义(非 structured/relational 数据)。
  2. 如果我们将食谱与用户集合一起嵌入,则在同一集合中查找数据会相当容易。
  3. 如果菜谱是不同的集合,那么万一用户有新菜谱(不存在于菜谱集合中),那么我们也需要添加到菜谱集合中。

我建议将食谱作为数组嵌入到用户集合中,因为嵌入这将使查询数据和查看用户集合变得容易,文档大小不会超过 16 MB 的限制。

希望对您有所帮助。