繁体   English   中英

使用嵌套字段在MongoDB / Mogoose中创建多对多关系?

[英]Creating a many-to-many relationship in MongoDB/ Mogoose using nested fields?

我目前正试图在mongodb / mongoose中建立多对多关系。

我有两个模式:

// User Schema
var UserSchema = mongoose.Schema({
    email: {
        type: String,
        index:true
    },
    name: {
        type: String
    },
    tasks:[{type:mongoose.Schema.ObjectId, ref: 'Tasks'}]
});

// Tasks Schema
var TaskSchema = mongoose.Schema({
    name: {
        type: String,
        index: true
    },
    description: {
        type: String
    },
    status:{
        type: String
    },
});

这里的想法是,每个用户都可以执行任务,并且该任务将具有每个用户自己的状态(例如notStarted,inProgress,Complete,Failed)。 该状态将随着用户执行任务的过程而改变。 每个用户将看到相同的任务(即名称和描述),但具有与其相关的不同状态。 此外,每个任务都有其自己的状态(可用,隐藏),这将指示用户是否可以看到该任务。 对于每个用户来说,这并不是唯一的。

到目前为止,这是我的思考过程:

我在想可以将每个任务的objectId与状态一起嵌套在用户中。 例如:

{
   email: "Bob@bob.com"
   name: "Bob",
   tasks: {
     { _id: 001, status: "Active"},
     {_id: 002, status: "inProgress"},
     { _id: 003, status: "Failed"}
   }
 },
 {
   email: "Mary@mary.com"
   name: "Mary",
   tasks: {
     { _id: 001, status: "Failed"},
     { _id: 002, status: "Active"},
     { _id: 003, status: "Active"}
   }
 }

但是,这意味着每当我创建一个新任务时,都需要将其添加到所有用户的任务列表中,并将状态设置为默认值(例如notStarted)。 另外,无论何时添加新用户,我都需要获取所有任务并将其添加到用户的任务列表中。

在我看来,这有点笨拙,我觉得必须有更好的方法。 如果这最好的方法,那么我不太确定该怎么写。 我在想也许使用addFields还是Push更合适? 还是会创建无限增长的数组? 从我所读的内容来看,这可能是一个Mongo反模式,这可能不是最好的主意?

我还发现这篇文章有点相关,但它来自大约6年前,我想我需要更多的深度或代码示例。

任何帮助将非常感激!

如果要在创建新任务时在用户中添加新任务,则查询应为:

  taskCtr.create = (req, res) => {
  const {
      name,
      description,
      status
  } = req.body;

  TaskSchema.create({
      name,
      description,
      status
  }).then((result) => {
      if (result) {
          UserSchema.update({}, {
              $push: {
                  tasks: {
                      _id: result._id,
                      status: result.status
                  }
              }
          }, {
              multi: true
          }).then((userUpdated) => {
              res.status(200).json({
                  message: 'A new Task created successfully!'
              })
          }).catch((err) => {
              res.status(500).json({
                  error: 'Internal server error!'
              });
          });
      }
  }).catch((err) => {
      res.status(500).json({
          error: 'Internal server error!'
      });
  });
 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM