-
-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Closed
Labels
confirmed-bugWe've confirmed this is a bug in Mongoose and will fix it.We've confirmed this is a bug in Mongoose and will fix it.
Milestone
Description
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
Labels
confirmed-bugWe've confirmed this is a bug in Mongoose and will fix it.We've confirmed this is a bug in Mongoose and will fix it.