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

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

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

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

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

Вы можете использовать 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" } } ]) 

Я хотел использовать найти не агрегат. Простое добавление другого $eq сработало для меня.

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

новый участник этого сайта. Будьте внимательны, спрашивая разъяснения, комментируя и отвечая. Проверьте наш

Правила поведения

,