Могу ли я использовать $ pull и обновить оставшиеся элементы в том же массиве в Mongo / Mongoose? - PullRequest
1 голос
/ 11 декабря 2019

У меня есть схема Delivery:

const DeliverySchema = new mongoose.Schema({
    projectId: { type: String, default: "", trim: true },
    tasks: [{
        timestamp: { type: Date, default: new Date() },
        isAssigned: { type: Boolean, default: false },
        dr1Manager: { type: Schema.Types.ObjectId, ref: 'User' },
        dr2Manager: { type: Schema.Types.ObjectId, ref: 'User' },
        status: { type: String, default: "dr1", trim: true },
        pair: { type: String, default: "", trim: true },
        taskId: { type: String, default: "", trim: true },
        files: [{
            fileName: { type: String, default: "", trim: true },
            path: { type: String, default: "", trim: true },
            isFileApproved: { type: Boolean, default: false },
            isOriginal: { type: Boolean, default: false },
        }],
        instructions: [{
            step: { type: String, default: "dr1", trim: true },
            text: { type: String, default: "", trim: true },
            isChecked: { type: Boolean, default: false }
        }],
    }]
});

Я хотел бы знать, могу ли я $pull данные из массива instructions и изменить оставшиеся элементы в этом массиве в том же запросе,Я пытаюсь сделать это следующим образом:

await Delivery.updateOne(
  { projectId, "tasks.taskId": taskId },
  {
    "tasks.$[i].isAssigned": false,
    "tasks.$[i].status": "dr1",
    "tasks.$[i].dr1Manager": manager,
    $pull: { "tasks.$[i].instructions": { step: "dr2" } },
    "tasks.$[i].files.$[j].isFileApproved": false,
    "tasks.$[i].instructions.$[k].isChecked": false
  },
  {
    arrayFilters: [
      { "i.taskId": taskId },
      { "j.isFileApproved": true },
      { "k.isChecked": true }
    ]
  }
);

В результате я получаю сообщение об ошибке:

Обновление пути \ 'задачи. $ [I] .instructions \'создаст конфликт в \' задачах. $ [i] .instructions \

Итак, как мне это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...