Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoError: Found multiple array filters with the same top-level field name

folks. I'm working in Node.js with a MongoDB collection that has a field that is an array of objects, like so:

{_id: 'someIdNumber',
text: 'some text',
replies: [{_id: 'someReplyId', replyText: 'some reply text', password: 'somePassword'}, {...}]

I'm trying to update the replyText field of the replies array using the $[<identifier>] array update operator as shown in the MongoDB documentation: https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/ What I'm trying to do is as follows:

db.collection('collectionName').updateOne(
                { _id: ObjectID('whateverId') },
                { $set: { "replies.$[elem].replyText": "new text" } },
                {
                  arrayFilters: [{ "elem._id": ObjectID(req.body.reply_id)}, {"elem.password": 'whateverPassword}]
                },
                (err, data) => {console.log('hooray, it worked')}

This throws an error, MongoError: Found multiple array filters with the same top-level field name elem. If I get rid of one of my arrayFilters, this fixes the error, but obviously at the expense of my filtering conditions.

The MongoDB documentation's example of this process, (I've shortened the collection students2 to a single document,) is as follows:

{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
      { "grade" : 85, "mean" : 100, "std" : 4 },
      { "grade" : 85, "mean" : 100, "std" : 6 }
   ]
}


db.students2.update(
   { },
   { $inc: { "grades.$[elem].std" : -1 } },
   { arrayFilters: [ { "elem.grade": { $gte: 80 }, "elem.std": { $gt: 5 } } ], multi: true }
)

The syntax is a tiny bit different because the documentation is using the Mongo shell method, not Node.js, but otherwise, it looks to me like I'm doing what the documentation says to do. I'm using updateOne and not update because I only want to update one document, and I'm not using multi for the same reason. Any insight on how I could get this to work with both arrayFilters intact would be much appreciated. Thanks for your time!

like image 963
LuosRestil Avatar asked Sep 05 '25 03:09

LuosRestil


1 Answers

Got it! Unfortunately I cannot upvote the question/comment hence adding here for others to benefit. Thanks @LuosRestil and @typesafe for getting me to the fix. I had the same syntax error where I tried to add multiple expressions for the same field in the array for the arrayFilters. It should be once expression per field.

WRONG:

arrayFilters: [
  { "elemA.<fieldName1>": "value1" },
  { "elemA.<fieldName2>": "value2" },
  { "elemA.<fieldName3>": "value3" }
];

CORRECT:

arrayFilters: [
  {
    "elemA.<fieldName1>": "value1",
    "elemA.<fieldName2>": "value2",
    "elemA.<fieldName3>": "value3"
  }
];
like image 66
mhussainm Avatar answered Sep 09 '25 20:09

mhussainm