MongoDB найти выражение с несколькими эквалайзерами - PullRequest
0 голосов
/ 23 января 2019

Этот запрос, который должен фильтровать результаты по месяцам, работает нормально. Но я не могу понять, как добавить годовой фильтр.

db.collection.find({
  "$expr": {
    "$eq": [{ "$month": "$timestamp" }, 12]
  }
});

Я пытался придумать что-то подобное, но безуспешно.

db.collection.find({
  "$expr": {
    "$and": [
      { "$eq": [{ "$month": "$timestamp" }, 12] }, 
      { "$eq": [{ "$year": "$timestamp" }, 2018] }
    ]
  }
});

Как это сделать правильно?

1 Ответ

0 голосов
/ 24 января 2019

Вы можете использовать aggregate вместо find.

Будет отлично работать трехшаговое решение:

  1. $project поля года и месяца вместе с документомсам, используя $$ROOT.Поскольку $project выводит только указанные поля, нам также необходимо спроецировать сам документ.
  2. Отфильтровать по нужному году и месяцу, используя $match.
  3. $replaceRoot вернуть исходный документ на верхний уровень (сгладить его).
db.collection.aggregate([
  {
    "$project": {
      "year": { "$year": "$timestamp" },
      "month": { "$month": "$timestamp" },
      "document": "$$ROOT"
    }
  },
  {
    "$match": {
      "year": 2018,
      "month": 12
    }
  },
  {
    "$replaceRoot": { "newRoot": "$document" }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...