$toBool (aggregation)
Definition
New in version 4.0.
Converts a value to a boolean.
$toBool
has the following syntax:
- {
- $toBool: <expression>
- }
The $toBool
takes any valid expression.
The $toBool
is a shorthand for the following$convert
expression:
- { $convert: { input: <expression>, to: "bool" } }
See also
Behavior
The following table lists the input types that can be converted to aboolean:
Input Type | Behavior |
---|---|
Boolean | No-op. Returns the boolean value. |
Double | Returns true if not zero.Return false if zero. |
Decimal | Returns true if not zero.Return false if zero. |
Integer | Returns true if not zero.Return false if zero. |
Long | Returns true if not zero.Return false if zero. |
ObjectId | Returns true. |
String | Returns true. |
Date | Returns true. |
The following table lists some conversion to boolean examples:
Example | Results |
---|---|
{$toBool: false} | false |
{$toBool: 1.99999} | true |
{$toBool: NumberDecimal("5")} | true |
{$toBool: NumberDecimal("0")} | false |
{$toBool: 100} | true |
{$toBool: ISODate("2018-03-26T04:38:28.044Z")} | true |
{$toBool: "false"} | true |
{$toBool: ""} | true |
{$toBool: null} | null |
Example
Create a collection orders
with the following documents:
- db.orders.insert( [
- { _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
collectionconverts the shipped
to a boolean value before finding theunshipped 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 aggregationoperation stops and throws an error. To override this behavior, use$convert
instead.