allen
allen

Reputation: 309

mongodb find and update one with multiple conditions


{
roomId: "id",
questions:{
     q1:{
        user1:"user1's work"
        }
          }
}

I'm trying to query mongodb with multiple conditions, that roomId has to match, and questions must be q1, and in q1 there must be a user1.

Here's what I've tried so far. Using and operator, but doesn't seems to work.For now I'm using find, as I read in the docs that updateMany has the same query selector as find.

const result = await collection.find({
      $and: [
        {
          roomId: roomId,
        },
        {
          questions: {
            currentQuestion: {
              userName,
            },
          },
        },
      ],
    });

My schema:


{
roomId: "id",
roomName:"roomName",
questions:{
     question1:{
        user1:"user1's work",

        userN: "userN's work"
        },

      questionN:{
        user1:"",
        userN:""
         }

          }
}

My expected input , (roomId, currentQuestion, userName) for query conditions,"userWork" to be inserted to what's under userName (user1 - userN). Expected output, that the user's work gets updated with "userWork", under the right room, right currentQuestion and the right user.

Upvotes: 0

Views: 3883

Answers (1)

J.F.
J.F.

Reputation: 15187

You need this query I think:

db.collection.find({
  "roomId": "id",
  "questions.q1.user1": {
    $exists: true
  }
})

This query find a roomId which match your 'id' and then, check if exists the element questions.q1.user1.

Mongo playground example here

PS: You said update but... what do you want to update?

Assuming your schema is like

{
  roomId: "id",
  questions: {
    q1: {
      user1: "user1's work",
      currentQuestion: "currentQuestion1"
    }
  }
}

Then, the query to update the currentQuestion field whose match the id and has existing questions.q1.user1 is this:

db.collection.update({
  "roomId": "id",
  "questions.q1.user1": {
    $exists: true
  }
},
{
  "$set": {
    "questions.q1.currentQuestion": "new question"
  }
})

Example here

Note that if currentQuestion is one level up, you only have to modify $set object.

If you are not asking for this, please provide a complete schema, example input and expected output.

Upvotes: 1

Related Questions