$toBool (aggregation)
Definition
$toBoolConverts a value to a boolean.
$toBoolhas the following syntax:{ $toBool: <expression> } The
$toBooltakes any valid expression.The
$toBoolis a shorthand for the following$convertexpression:{ $convert: { input: <expression>, to: "bool" } } See also:
Behavior
The following table lists the input types that can be converted to a boolean:
Input Type  | Behavior  | 
|---|---|
Array  | Returns true  | 
Binary data  | Returns true  | 
Boolean  | No-op. Returns the boolean value.  | 
Code  | Returns true  | 
Date  | Returns true  | 
Decimal  | Returns true if not zero Return false if zero  | 
Double  | Returns true if not zero Return false if zero  | 
Integer  | Returns true if not zero Return false if zero  | 
JavaScript  | Returns true  | 
Long  | Returns true if not zero Return false if zero  | 
MaxKey  | Returns true  | 
MinKey  | Returns true  | 
Null  | Returns null  | 
Object  | Returns true  | 
ObjectId  | Returns true  | 
Regular expression  | Returns true  | 
String  | Returns true  | 
Timestamp  | Returns true  | 
To learn more about data types in MongoDB, see BSON Types.
The following table lists some conversion to boolean examples:
Example  | Results  | 
|---|---|
  | false  | 
  | true  | 
  | true  | 
  | false  | 
  | true  | 
  | true  | 
  | true  | 
  | true  | 
  | null  | 
Example
Create a collection orders with the following documents:
db.orders.insertMany( [    { _id: 1, item: "apple",  qty: 5, shipped: true },    { _id: 2, item: "pie",  qty: 10, shipped: 0  },    { _id: 3, item: "ice cream", shipped: 1 },    { _id: 4, item: "almonds", qty: 2, shipped: "true" },    { _id: 5, item: "pecans", shipped: "false" },  // Note: All strings convert to true    { _id: 6, item: "nougat", shipped: ""  }       // Note: All strings convert to true ] ) 
The following aggregation operation on the orders collection
converts the shipped to a boolean value before finding the
unshipped orders:
// Define stage to add convertedShippedFlag field with the converted shipped value // Because all strings convert to true, include specific handling for "false" and "" shippedConversionStage = {    $addFields: {       convertedShippedFlag: {          $switch: {             branches: [               { case: { $eq: [ "$shipped", "false" ] }, then: false } ,               { case: { $eq: [ "$shipped", "" ] }, then: false }             ],             default: { $toBool: "$shipped" }         }       }    } }; // Define stage to filter documents and pass only the unshipped orders unshippedMatchStage = {    $match: { "convertedShippedFlag": false } }; db.orders.aggregate( [   shippedConversionStage,   unshippedMatchStage ] ) 
The operation returns the following document:
{ "_id" : 2, "item" : "pie", "qty" : 10, "shipped" : 0, "convertedShippedFlag" : false } { "_id" : 5, "item" : "pecans", "shipped" : "false", "convertedShippedFlag" : false } { "_id" : 6, "item" : "nougat", "shipped" : "", "convertedShippedFlag" : false } 
Note
If the conversion operation encounters an error, the aggregation
operation stops and throws an error. To override this behavior, use
$convert instead.