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
,
Трехшаговое решение будет отлично работать:
$project
поля года и месяца вместе с самим документом, используя$$ROOT
, поскольку$project
выводит только указанные поля, нам нужно будет спроектировать и сам документ.- Фильтруйте по году и месяцу, используя
$match
, $replaceRoot
вернуть исходный документ на верхний уровень (сгладить его).
db.collection.aggregate([
{
"$project": {
"year": { "$year": "$timestamp" },
"month": { "$month": "$timestamp" },
"document": "$$ROOT"
}
},
{
"$match": {
"year": 2018,
"month": 12
}
},
{
"$replaceRoot": { "newRoot": "$document" }
}
])