Search code examples
mongodbmongoosemongoose-schema

"No array filter found for identifier 'elm' in path 'questions.$[elm].status'"


everyone I am new to mongodb and learning it, While practicing I got this problem trying to solve but didn't find the correct result as expected.

WriteError({ "index" : 0, "code" : 2, "errmsg" : "No array filter found for identifier 'elm' in path 'questions.$[elm].status'", "op" : { "q" : { "_id" : ObjectId("61efbcbbc88f9153b87e74c4") }, "u" : { "$set" : { "questions.$[elm].status" : "delivered" } }, "multi" : true, "upsert" : false } })

getting this error please help me.

{
        questionnaireName: "Name of questionnaire 1",
        questions: [
            {
                questionName: "Question 1",
                instruction: "additional instruction",
                status: "assigned",
                assignedUser: "[email protected]",
                isDeleted: false,
                messageId: "12345678"
            },
            {
                questionName: "Question 2",
                instruction: "additional instruction",
                status: "assigned",
                assignedUser: "[email protected]",
                isDeleted: false,
                messageId: "12345678"
            },
            {
                questionName: "Question 3",
                instruction: "additional instruction",
                status: "assigned",
                assignedUser: "[email protected]",
                isDeleted: true,
                messageId: "12345678"
            },
            {
                questionName: "Question 4",
                instruction: "additional instruction",
                status: "assigned",
                assignedUser: "[email protected]",
                isDeleted: false,
                messageId: "12345678"
            },
            {
                questionName: "Question 5",
                instruction: "additional instruction",
                status: "assigned",
                assignedUser: "[email protected]",
                isDeleted: false,
                messageId: "12345678"
            },
        ]
    }
I have tried to update all questions array element status based on the condition that the question element should not be deleted, and messageId, and assignedUser should be same.

db.myQuestionnaire.updateMany({
  _id: ObjectId("61efbcbbc88f9153b87e74c4")
}, {
  $set: {
    "questions.$[elm].status": "delivered"
  }
}, {
  multi: true,
  arrayFilter: [{ "elm.messageId": "12345678", "elm.isDeleted": false, "elm.assignedUser": "[email protected]" }]
})

Another query that I tried

db.myQuestionnaire.updateOne({
  _id: ObjectId("61efbcbbc88f9153b87e74c4"), questions: {
    $elemMatch: {
      messageId: "12345678",
      isDeleted: false,
      assignedUser: "[email protected]"
    }
  }
}, {
  $set: {
    "questions.$.status": "delivered"
  }
})

and expecting result should be

    {
            questionnaireName: "Name of questionnaire 1",
            questions: [
                {
                    questionName: "Question 1",
                    instruction: "additional instruction",
                    status: "delivered",
                    assignedUser: "[email protected]",
                    isDeleted: false,
                    messageId: "12345678"
                },
                {
                    questionName: "Question 2",
                    instruction: "additional instruction",
                    status: "delivered",
                    assignedUser: "[email protected]",
                    isDeleted: false,
                    messageId: "12345678"
                },
                {
                    questionName: "Question 3",
                    instruction: "additional instruction",
                    status: "assigned",
                    assignedUser: "[email protected]",
                    isDeleted: true,
                    messageId: "12345678"
                },
                {
                    questionName: "Question 4",
                    instruction: "additional instruction",
                    status: "delivered",
                    assignedUser: "[email protected]",
                    isDeleted: false,
                    messageId: "12345678"
                },
                {
                    questionName: "Question 5",
                    instruction: "additional instruction",
                    status: "delivered",
                    assignedUser: "[email protected]",
                    isDeleted: false,
                    messageId: "12345678"
                },
            ]
        }

Solution

    1. There is typo , it is not arrayFilter , it is arrayFilters :

    playground with arrayFIlters

    1. This is working for single matching element in array , and as expected it is updating only first matching element in the array :

    playground with update one element array