Introduction to MongoDB $indexOfArray Operator

$indexOfArray is an array operator in MongoDB that searches for the first occurrence of a specified element in an array and returns its index. If the element is not found, it returns -1. This operator can only be used in the aggregation pipeline.

Syntax

The syntax for the $indexOfArray operator is as follows:

{ $indexOfArray: [ <array>, <value>, <start>, <end> ] }

Where the parameters are defined as:

  • <array>: the array to search.
  • <value>: the value to find.
  • <start>: an optional parameter that specifies the starting position of the search, defaults to 0.
  • <end>: an optional parameter that specifies the ending position of the search, defaults to the length of the array.

Use Cases

In the MongoDB aggregation pipeline, the $indexOfArray operator can be used in various scenarios, including:

  • Finding the position of an element in an array.
  • Dividing an array into multiple sub-arrays, with each sub-array containing all elements between specific values.
  • Finding all elements in an array after a specific element.

Examples

Example 1

The following aggregation pipeline uses the $indexOfArray operator to find the position of the value 5 in an array:

db.collection.aggregate([
  {
    $project: {
      index: { $indexOfArray: ["$myArray", 5] }
    }
  }
])

Assuming that the collection collection contains the following documents:

{
  myArray: [1, 2, 3, 4, 5]
}
{
  myArray: [6, 7, 8, 9]
}

After running the above pipeline, the results are:

{ "index": 4 }
{ "index": -1 }

The above results indicate that the position of the value 5 in the myArray array of the first document is 4, while the myArray array in the second document does not contain the value 5, so it returns -1.

Example 2

The following aggregation pipeline uses the $indexOfArray operator to divide an array into multiple sub-arrays, with each sub-array containing all elements between specific values:

db.collection.aggregate([
  {
    $project: {
      myArray: [1, 2, 3, 4, 5, 6, 7, 8, 9],
      startIndex: { $indexOfArray: ["$myArray", 3] },
      endIndex: { $indexOfArray: ["$myArray", 7] }
    }
  },
  {
    $project: {
      subArrays: {
        $map: {
          input: {
            $range: ["$startIndex", "$endIndex"]
          },
          as: "index",
          in: {
            $arrayElemAt: ["$myArray", "$$index"]
          }
        }
      }
    }
  }
])

After running the above pipeline, the results are:

{ "_id" : ObjectId("617d54c1a860c1b4ef4e4b25"), "subArrays" : [ 3, 4, 5, 6, 7 ] }

The above results indicate that the sub-array of myArray from element 3 to element 7 (inclusive) is [ 3, 4, 5, 6, 7 ].

Conclusion

The $indexOfArray operator can be used to retrieve the index of a specific element in an array and to split an array into multiple subarrays. In practical applications, this operator can be used to perform some complex data processing operations, such as replacing a specific element in an array or grouping an array based on a specific element. It is necessary to use and adjust it according to the specific situation. The flexible use of the $indexOfArray operator can make data processing more efficient and convenient.