Запрос на проверку всех элементов массива

У меня есть alley с такими данными (this is a alley)

{
    "_id": {"$oid": "62572d82cc40164fef7f1a56"},
    "name": "Аллея с 2-мя липами",
    "tree": [
      {"$oid": "626976eb4b93122bc617d701"},
      {"$oid": "626976eb4b93122bc617d702"}
    ]
  }

И есть tree(this is a tree)

{
    "_id": {"$oid": "626976eb4b93122bc617d701"},
    "dateInstall": {"$date": "2021-02-27T00:00:00.000Z"},
    "species": [
      {"$oid": "62585a63edfc726a4ff24fb8"}
    ]
  },

Мне необходимо написать запрос "аллея, деревья на которой не высаживались в прошлом году"(I need to write a query "an alley where trees were not planted last year")
Написал такое(My Code)

db.alley.aggregate([
    {
        $lookup: {
            from: "tree",
            localField: "tree",
            foreignField: "_id",
            as: "tree"
        }
    },
    {
        $match: {{$not:{$and:[
                    {"tree.dateInstall": {$gt: new ISODate("2020-12-31")}},
                    {"tree.dateInstall": {$lt: new ISODate("2022-01-01")}}
                    ]
            }}}
    }
]);

Ответы (1 шт):

Автор решения: 34trehtbgdw45rtb

Сначала вы должны раскрутить деревья в аллеях ($unwind: "$tree"), чтобы вы могли правильно $lookup-ить деревья в коллекции деревьев. Используйте pipeline внутри $lookup для запроса только деревьев, посаженных в прошлом году. Наконец, снова сгруппируйте($group) деревья в аллеи и используйте $match, чтобы отфильтровать эти аллеи без деревьев.
Это перевод ответа на en.stackoverflow: https://stackoverflow.com/questions/72096540/request-to-check-all-array-elements

db.getCollection("alley").aggregate([
  {
    $unwind: "$tree",
  },
  {
    $lookup: {
        from: "tree",
        let: { tree: "$tree" },
        pipeline: [
          {
            $match: {
              $expr: {
                $and: [
                  { $eq: [ "$$tree", "$_id" ] },
                  { $gt: [ "$dateInstall", new ISODate("2020-12-31") ] },
                  { $lt: [ "$dateInstall", new ISODate("2022-01-01") ] },
                ]
              }
            }
          }
        ],
        localField: "tree",
        foreignField: "_id",
        as: "tree"
    }
  },
  {
    $group: {
      _id: { id: "$_id", name: "$name" },
      trees: { $addToSet: { $first: "$tree" } }
    }
  },
  {
    $match: {
      trees: { $size: 0 }
    }
  }
])
→ Ссылка