MongoDB найти выражение с несколькими эквалайзерами

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

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

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

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

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

1 ответ

Я хотел использовать поиск, а не агрегат. Добавление еще одного$eq с $and как это сработало для меня.

db.collection.find({
  $and: [
    { $expr: {$eq: [{$month: "$timestamp"}, 12]} },
    { $expr: {$eq: [{$year: "$timestamp"}, 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" }
  }
])
Другие вопросы по тегам