У меня есть запрос, который мне нужно написать, где мне нужно определить количество элементов в массиве (я знаю, что это можно сделать через $project
с $size
, а затем $match
), но затем мне нужнобыть в состоянии обработать элементы массива, которые соответствуют этому условию, и если они не удовлетворяют условию, оставьте их.Я не хочу исключать элементы, которые не соответствуют критериям, через $match
Вот стандартный подход к подсчету элементов в массиве, которые не могут работать для того, что мне нужно :
db.collection.aggregate([
{ $project: { _id:1,
themeArraySize: { $gt: [ {$size: "$themes" }, 1 ] } } },
{ $match: { themeArraySize : true }} ,
])
Мне нужно обернуть это в условие, а не исключать что-либо путем сопоставления
«Логика» того, чего я хочу достичь для массива тем, такова:
- Если массив имеет длину> 1 И
- Есть элемент массива со значением "[]" ИЛИ "НЕ ВЫБРАНЫ ТЕМЫ"
- THEN $ PULL«[]» или «НЕТ ВЫБРАННЫХ ТЕМ» из массива тем
- В противном случае возвращает
themes
массив
Часть, с которой я борюсь, - это как обрабатывать истинулогика
Помещение в предложение:
"Если в массиве есть тема '[]', и это единственная тема, оставьте ее в покое. Но если'[]' присутствует, и есть другие темы, удалите '[]' из массива "
Я начал:
{
"$project": {
"conversationid": 1,
"themes": {
"$cond": [
{
"$and": [
{
"$or": [
{
"$in": [
"[]",
"$themes"
]
},
{
"$in": [
"NO THEMES SELECTED",
"$themes"
]
}
]
},
{
"$themes": {
"$gte": [
******I WANT TO SAY THAT THE THEMES ARRAY MUST BE >1 IN SIZE HERE******
]
}
}
]
},
{
"$pull": {
"$themes": {
"$in": [
"NO THEMES SELECTED",
"[]"
]
}
}
},
"$themes"
]
}
}
},
Но я получаюСмысл в том, что то, что я хочу сделать, невозможно
Спасибо