Search code examples
mongodbmongodb-queryaggregation-framework

Return null default value if no result found


I have a collection that looks like this:

{  
"value" : "20",
"type" : "square",
"name" : "form1"
}
{
"value" : "24",
"type" : "circle",
"name" : "form2"
}
{
"value" : "12",
"type" : "square",
"name" : "form3"
}

I want to extract a document with name = form2 so I type:

db.myCollec.find({"name":"form2"} , {"name":1, "type":1, "_id":0})

The result is:

{ "name" : "form2", "type" : "circle" }

Now if I want to find a document with name = form4 I type:

db.myCollec.find({"name":"form4"} , {"name":1, "type":1, "_id":0})

But this returns nothing because there is no document with this name.

However I want the return value to look like this:

{ "name" : "form4", "type" : null }

How would I do this?


Solution

  • You can use below aggregation

    Mongodb doesn't produce the result if there is not $matched data found with the query.

    But you can use $facet aggregation which processes multiple aggregation pipeline within single stage.

    So first use $facet to get the $matched documents and use $projection if no ($ifNull) data found.

    let searchTerm = "form2"
    
    db.myCollec.aggregate([
      { "$facet": {
        "data": [
          { "$match": { "name": searchTerm  }},
          { "$project": { "name": 1, "type": 1, "_id": 0 }}
        ]
      }},
      { "$project": {
        "name": {
          "$ifNull": [{ "$arrayElemAt": ["$data.name", 0] }, searchTerm ]
        },
        "type": {
          "$ifNull": [{ "$arrayElemAt": ["$data.type", 0] }, null]
        }
      }}
    ])