0
{
id:1,
projectName:'Project1'
start:"17-04-2022",
end:"12-05-2020",
tasks:[
{
taskId:1,
taskName:'first task',
taskStart:'20-04-2022',
taskEnd:'25-04-2022'
},

{
taskid:2,
taskName:'second task',
taskStart:'25-04-2022',
taskEnd:'30-04-2022'
},

]
},
{
id:2,
projectName:'Project2'
start:"27-04-2022",
end:"22-05-2020",
tasks:[
{
taskId:1,
taskName:'first task',
taskStart:'30-04-2022',
taskEnd:'12-05-2022'
},

{
taskid:2,
taskName:'second task',
taskStart:'28-04-2022',
taskEnd:'15-05-2022'
},

]
}

如何使用文档 id=1 和 taskID=1 更新任务数组的字段“taskEnd”,并且在更新时,如果来自前端的用于更新“taskEnd”的数据超过“end”字段,同时更新“end”字段相同的值。

提前致谢,

我知道如何使用两个单独的查询更新对象数组的特定字段和字段的条件更新。

可以通过单个查询完成吗?

4

1 回答 1

0

您可以使用管道更新而不是使用更新文档来执行此操作。我假设您以与其他日期相同的格式获取输入日期。

var input_date = "11-05-2020";
db.collection.update({
  id: 1
},
[
  {
    $addFields: {
      end: {
        $cond: [
          {
            $gt: [
              {
                $dateFromString: {
                  dateString: "$end"
                }
              },
              {
                $dateFromString: {
                  dateString: input_date 
                }
              }
            ]
          },
          "$end",
          input_date 
        ]
      },
      tasks: {
        $map: {
          input: "$tasks",
          as: "elem",
          in: {
            $cond: [
              {
                $eq: [
                  "$$elem.taskId",
                  1
                ]
              },
              {
                $setField: {
                  field: "taskEnd",
                  input: "$$elem",
                  value: input_date 
                }
              },
              "$$elem"
            ]
          }
        }
      }
    }
  }
])
于 2022-02-06T05:46:07.083 回答