Tuesday, 6 November 2018

Match two equal fields of arrays of same documents without $unwind

I have below workouts collection

[
  {
    "receiverWorkout": {
      "exercises": [
        { "_id": "1", "reps": 0 },
        { "_id": "2", "reps": 4 }
      ]
    },
    "senderWorkout": {
      "exercises": [
        { "_id": "2", "reps": 12 },
        { "_id": "1", "reps": 8 }
      ]
    }
  }
]

I need to match same _id from receiverWorkout and senderWorkout exercises and want to add a key won true or false whose reps are greater.

If you can see first element of receiverWorkout exercises({ "_id": "1", "reps": 0 }) is matching with the second element of the senderWorkout exercises({ "_id": "1", "reps": 8 }) because both have same _id

I have tried this but it does match the same indexes elements

db.colname.aggregate({
  "$addFields":{
    "senderWorkout.exercises":{
      "$map":{
        "input":{"$range":[0,{"$size":"$senderWorkout.exercises"}]},
        "as":"ix",
        "in":{
          "$let":{
            "vars":{
              "rec":{"$arrayElemAt":["$receiverWorkout.exercises","$$ix"]},
              "sen":{"$arrayElemAt":["$senderWorkout.exercises","$$ix"]}
            },
            "in":{
              "_id":"$$sen._id",
              "reps":"$$sen.reps",
              "won":{"$gt":["$$sen.reps","$$rec.reps"]}
            }
          }
        }
      }
    }
  }
})

Expected output should be something like

[
  {
    "receiverWorkout": {
      "exercises": [
        { "_id": "1", "reps": 0, "won": false },
        { "_id": "2", "reps": 4, "won": false }
      ]
    },
    "senderWorkout": {
      "exercises": [
        { "_id": "2", "reps": 12, "won": true },
        { "_id": "1", "reps": 8, "won": true }
      ]
    }
  }
]

I want to avoid $unwind

Please help!!!



from Match two equal fields of arrays of same documents without $unwind

No comments:

Post a Comment