I have a collection that looks like this:
{
\"value\" : \"20\",
\"type\" : \"square\",
\"name\" : \"form1\"
}
{
\"value\" : \"24\",
\"type\" : \"circle\",
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]
}
}}
])
Why you dont check in callback if result==null and create your own empty object?
let name = "form4";
db.myCollec.find({"name":name} , {"name":1, "type":1, "_id":0}, function(err, result){
if(err) {
// Error handling
return;
}
if (result==null){
result = {"name":name, "type":null};
}
});