MongoDB:Jak připojit k řetězci v hlubokém vnořeném poli

Jsem fanoušek webový programátor, který se právě začal učit MongoDB/Mongoose a nemůžu přijít na to, jak připojit k řetězci umístěnému v hlubokém vnořeném poli. Snažím se připojit řetězec na konec hours: String . Níže je schéma, se kterým pracuji:

const TestSchema = new Schema({
    userID: Number, 
    years: [
        {
            year: Number,
            months: [{
                month: Number,
                days: [{
                    day: Number,
                    hours: String
                }]
            }]
        }
    ]
});

Tady je to, co zatím mám. Pokusil jsem se rozšířit tuto odpověď zde:https://stackoverflow.com/a/56589089. Ale toto mi dává Cannot specify arrayFilters and a pipeline update chyba.

TestModel.findOneAndUpdate(
  { "years.months.days.day": 12 },
  [
    {
      $set: {
        "years.$[index1].months.$[index2].days.$[index3].hours": {
          $concat: [
            "$years.$[index1].months.$[index2].days.$[index3].hours",
            " 44:44:44"
          ]
        }
      }
    }
  ],
  {
    arrayFilters: [
      { "index1.year": 2020 },
      { "index2.month": 7 },
      { "index3.day": 12 }
    ]
  }
).catch(error => {
  console.log("error>>" + error);
});

Edit:Níže je kód, pomocí kterého jsem vytvořil instanci modelu

var test = new TestModel({
    userID: 5,
    years: [{
        year: 2020, 
        months: [{
            month: 7,
            days: [{
                day: 12,
                hours: "4:4:4 5:5:5"
            }]
        }]
    }]
})

test.save().then(function(){
    console .log("testSaved>>" + !test.isNew);
});

Zde je snímek obrazovky dat v db:Velmi oceníme jakoukoli pomoc.

Odpověď

Aktualizace nepodporuje obě operace společně „arrayFilters“ a „agregační kanál“, musíte použít pouze jednu operaci z obou,

Zde tedy musíte použít pouze agregační kanál aktualizací pomocí vnořených $map ,

TestModel.findOneAndUpdate({
    years: {
      $elemMatch: {
        year: 2020,
        months: {
          $elemMatch: {
            month: 7,
            days: { $elemMatch: { day: 12 } }
          }
        }
      }
    }
  },
  [{
    $set: {
      years: {
        $map: {
          input: "$years",
          as: "y",
          in: {
            $mergeObjects: [
              "$$y",
              {
                months: {
                  $map: {
                    input: "$$y.months",
                    as: "m",
                    in: {
                      $mergeObjects: [
                        "$$m",
                        {
                          days: {
                            $map: {
                              input: "$$m.days",
                              as: "d",
                              in: {
                                $mergeObjects: [
                                  "$$d",
                                  {
                                    hours: {
                                      $cond: {
                                        if: { 
                                          $and: [
                                            { $eq: ["$$y.year", 2020] },
                                            { $eq: ["$$m.month", 7] },
                                            { $eq: ["$$d.day", 12] }
                                          ] 
                                        },
                                        then: { $concat: ["$$d.hours", " 44:44:44"] },
                                        else: "$$d.hours"
                                      }
                                    }
                                  }
                                ]
                              }
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }]
)