Как обновить вложенный объект типа Map - PullRequest
0 голосов
/ 22 февраля 2020

Я хотел обновить вложенный объект, который является Схемой типа Карты. С кодом ниже, это ничего не меняет. Я пытался использовать set (), update (), finedOneAndUpdate (). но ни один из них не работал. Я действительно ценю, что люди помогают мне.

Схема:

const ColumnSchema = new Schema(
  {
    title: { type: String },
    tasks: { type: Map, of: TaskSchema } <- I want to update this
    taskOrder: [{ type: mongoose.Schema.Types.ObjectId, ref: TaskSchema }] <- I want to update this
  }
);

const DashBoardSchema = new Schema(
  {
    user: { type: mongoose.Schema.Types.ObjectId, ref: User },
    dashBoardTitle: String,
    columns: { type: Map, of: ColumnSchema },
    columnOrder: [{ type: mongoose.Schema.Types.ObjectId, ref: ColumnSchema }]
  }

Это код, который я написал для этого

    let newTasks = {};
    let Board = await DashBoard.findOne({ _id: dashBoardId });
    let Column = await Board.columns.get(columnId);

    for (const key of Column.tasks.keys()) {
      // Prints "github", "twitter", "instagram"
      let item = Column.tasks.get(key);
      newTasks[item.id] = item;
    }

    // console.log("newTask", newTask);
    newTasks = {
      ...newTasks,
      [newTask._id]: newTask
    };

    const danshBoard = DashBoard.findOneAndUpdate(
      { _id: dashBoardId, columns: columnId },
      { $set: { tasks: newTasks }, $push: { taskOrder: newTask._id } },
      { new: true },
      (err, data) => {
        if (err) console.log(err);
        res.send(data);
      }
    );
  } catch (err) {
    console.log(err);
  }

Пример данных здесь

enter code here
{
    "columnOrder": [
        "5e51860c45c55708cb441595"
    ],
    "_id": "5e51860c45c55708cb441596",
    "dashBoardTitle": "a",
    "columns": {
        "5e51860c45c55708cb441595": {
            "taskOrder": [],
            "_id": "5e51860c45c55708cb441595",
            "title": "Second column",
            "tasks": {}
        }
    },
    "__v": 0
}

1 Ответ

1 голос
/ 23 февраля 2020

Вам нужно изменить свой запрос следующим образом:

let updateCond = {};
updateCond["$set"] = {};
updateCond["$set"]["columns."+columnId +".tasks"] = newTasks;
updateCond["$push"] = {};
updateCond["$push"]["columns."+columnId +".taskOrder"] = newTask._id;

const danshBoard = DashBoard.findOneAndUpdate(
  { _id: dashBoardId },
  updateCond,
  { new: true },
  (err, data) => {
    if (err) console.log(err);
    res.send(data);
  }
);

Кстати: Если вы сохранили свои данные таким образом:

{
    "_id" : "5e51860c45c55708cb441596",
    "columnOrder" : [ 
        "5e51860c45c55708cb441595"
    ],
    "dashBoardTitle" : "a",
    "columns" : [ 
        {
            "id" : "5e51860c45c55708cb441595",
            "data" : {
                "taskOrder" : [],
                "_id" : "5e51860c45c55708cb441595",
                "title" : "Second column",
                "tasks" : {}
            }
        }
    ],
    "__v" : 0
}

Мы можем подать заявку MongoDB arrayFilters функция

db.dashBoard.find({
  _id: "5e51860c45c55708cb441596"
},
{
  $set: {
    "columns.$[column].data.tasks": newTasks
  },
  $push: {
    "columns.$[column].data.taskOrder": newTask._id
  }
},
{
  new: true,
  arrayFilters: [
    {
      "column.id": columnId
    }
  ]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...