Bill
Bill

Reputation: 5150

Set new field to true/false if an array contains a specific value or not

If $myDogsName is in the array dogNamesOfWinnersArray then myDogWins should be true if its not in the array it should be false.

Is this even possible?

    db.collection.aggregate([
        {
            $addFields: { myDogWins: { $myDogsName: [ "$dogNamesOfWinnersArray", [] ] } }
        }
    ])

the array looks like

dogNamesOfWinnersArray: [
        {
            "name" : "jake", 
            "age" : 6, 
            "breed" : "Bulldog", 
            ...
        },
        {
            "name" : "fred", 
            "age" : 8, 
            "breed" : "Bulldog",
            ... 
        },

    ]

$myDogsName is jake so I expect myDogWins to be true

Upvotes: 3

Views: 1478

Answers (2)

prasad_
prasad_

Reputation: 14287

db.dogs.save( { _id: 1, name: "jake" } )
db.dogs.save( { _id: 2, name: "jake2" } )

db.dogs.aggregate( [
  { 
      $addFields: { 
          dogNamesOfWinnersArray: { 
              $concatArrays: [ [ ], dogNamesOfWinnersArray ] 
          } 
      } 
  },
  { 
      $addFields: { 
          myDogWins: { $in: [ "$name", "$dogNamesOfWinnersArray.name" ] } 
      } 
  },
  { 
      $project: { dogNamesOfWinnersArray: 0 } 
  }
] )

The output:

{ "_id" : 1, "name" : "jake", "myDogWins" : true }
{ "_id" : 2, "name" : "jake2", "myDogWins" : false }

Upvotes: 0

Sede
Sede

Reputation: 61225

The $in operator is what you need.

{
  "$addFields": {
    "myDogWins": {
      "$in": [
        "$myDogsName",
        "$dogNamesOfWinnersArray.name"
      ]
    }
  }
}

Upvotes: 3

Related Questions