Skip to content

Query with arrayFilters containing $and and $or keys are removed #13192

@raj-goguardian

Description

@raj-goguardian

Prerequisites

  • I have written a descriptive issue title
  • I have searched existing issues to ensure the bug has not already been reported

Mongoose version

5.13.16

Node.js version

14.x

MongoDB server version

4.4

Typescript version (if applicable)

No response

Description

When executing a query using MongooseJS that includes arrayFilters with both $and and $or keys, the $and and $or keys are being removed from the resulting query. This issue occurs regardless of the specific query or data being used, and can result in unexpected behavior when attempting to filter results based on multiple criteria.

This is fixed in [6.0.6 release](#10696).

Can you do the same for 5.13 version.

Steps to Reproduce

const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/test", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

mongoose.set("debug", true);

(async () => {
  const db = mongoose.connection;
  db.on("error", console.error.bind(console, "connection error:"));
  db.once("open", function () {
    console.log("connected to mongo successfully");

    const breedSchema = new mongoose.Schema({
      type: String,
      legs: Number,
    });

    const kittySchema = new mongoose.Schema({
      name: String,
      breed: breedSchema,
    });

    const Kitten = mongoose.model("Kitten", kittySchema);

    const fluffy = new Kitten({
      name: "fluffy",
      breed: { type: "siamese_cat", legs: 4 },
    });
    fluffy.save();

    const kitty = new Kitten({
      name: "kitty",
      breed: { type: "british_shorthair", legs: 4 },
    });
    kitty.save();

    const bean = new Kitten({
      name: "bean",
      breed: { type: "british_shorthair", legs: 3 },
    });
    bean.save();

    const simba = new Kitten({
      name: "simba",
      breed: { type: "british_shorthair", legs: 3 },
    });
    simba.save();

    const loki = new Kitten({
      name: "loki",
      breed: { type: "siamese_cat", legs: 4 },
    });
    loki.save();

    Kitten.updateOne(
      {},
      {
        $set: {
          "breed.$[elem].legs": 3,
        },
      },
      {
        arrayFilters: [
          {
            $and: [{ "elem.type": "siamese_cat" }, { "elem.legs": 4 }],
          },
        ],
      },
      function (err, result) {
        console.error(err);
        console.log(result);
      }
    );
  });
})();

and throws below error

Mongoose: kittens.updateOne({}, { '$set': { 'breed.$[elem].legs': 3 } }, { arrayFilters: [] })
MongoError: No array filter found for identifier 'elem' in path 'breed.$[elem].legs'
    at Function.create (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/core/error.js:59:12)
    at toError (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/utils.js:130:22)
    at /Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/operations/common_functions.js:384:39
    at handler (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/core/sdam/topology.js:961:24)
    at /Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/cmap/connection_pool.js:352:13
    at handleOperationResult (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/core/sdam/server.js:567:5)
    at MessageStream.messageHandler (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/cmap/connection.js:308:5)
    at MessageStream.emit (events.js:400:28)
    at processIncomingData (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
    at MessageStream._write (/Users/raj.achuta/workspace/validator/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
    at writeOrBuffer (internal/streams/writable.js:358:12)
    at MessageStream.Writable.write (internal/streams/writable.js:303:10)
    at Socket.ondata (internal/streams/readable.js:731:22)
    at Socket.emit (events.js:400:28)
    at addChunk (internal/streams/readable.js:293:12)
    at readableAddChunk (internal/streams/readable.js:267:9) {
  driver: true,
  index: 0,
  code: 2
}

Expected Behavior

Should able to update the documents.

Metadata

Metadata

Assignees

No one assigned

    Labels

    confirmed-bugWe've confirmed this is a bug in Mongoose and will fix it.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions