Different results when using findOne and findOneAndUpdate (positional operator)

In my code, I perform a findOneAndUpdate but instead of changing the found $ item in the array, it only updates the first element. When the same query is done with findOne (printing out the $ item), I get the valid item that should be changed. My issue seems to be related with Positional operator issue but it persists even after I replace $in with $elemmatch or remove it all together (itemUsers: user._id)

Schemas: https://pastebin.com/JESPgSVe

findOneAndUpdate (updates the first array element instead of the queried on)
findOneAndUpdate(
      {
        itemId,
        itemUsers: { $in: user._id },
        reviews: {
          $elemMatch: {
            reviewId,
            reviewer:  user._id,
            $or: [
              { createdAt: { $lte: Date.now() } },
              { createdAt: undefined },
            ],
          },
        },
      },
      { "reviews.$.createdAt":  new Date() }
    )
  )

findOne (returns the specified query)
findOne(
      {
        itemId,
        itemUsers: { $in: user._id },
        reviews: {
          $elemMatch: {
            reviewId,
            reviewer:  user._id,
            $or: [
              { createdAt: { $lte: Date.now() } },
              { createdAt: undefined },
            ],
          },
        },
      },
      "reviews.$"
    )
  )

you need to use array filters, as $ operator just updates first element of array but $[identifier] updates all matched objects.

you can use array filters something like this:

  findOneAndUpdate(
      {
        itemId,
        itemUsers: { $in: user._id },
        reviews: {
          $elemMatch: {
            reviewId,
            reviewer:  user._id,
            $or: [
              { createdAt: { $lte: Date.now() } },
              { createdAt: undefined },
            ],
          },
        },
      },
      {$set:{ "reviews.$[elem].createdAt":  new Date()}},{arrayFilters: [ {elem:{elem.reviewer:  user._id,
            $or: [
              { elem.createdAt: { $lte: Date.now() } },
              { elem.createdAt: undefined }]}} ]} 
    )