簡體   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