MongoDB extract only the selected item in array

The field selector parameter is limited to complete properties. It cannot be used to select part of an array, only the entire array. I tried using the $ positional operator, but that didn’t work.

The easiest way is to just filter the shapes in the client.

If you really need the correct output directly from MongoDB, you can use a map-reduce to filter the shapes.

function map() {
  filteredShapes = [];

  this.shapes.forEach(function (s) {
    if (s.color === "red") {

  emit(this._id, { shapes: filteredShapes });

function reduce(key, values) {
  return values[0];

res = db.test.mapReduce(map, reduce, { query: { "shapes.color": "red" } })