#mongodb #mongoose
Вопрос:
У меня есть запрос, и я хочу, чтобы при fullname
существовании поля добавлялось поле с именем type со значением ‘Users’, а при наличии name
вместо fullname я хочу добавить поле type со значением ‘POSTS’
Вот моя реализация, но она не работает:
const result = await User.aggregate([
{
$unionWith: "recipes",
},
{
$match: {
$or: [
{
fullname: { $regex: query, $options: "i" },
},
{
username: { $regex: query, $options: "i" },
},
{
name: {
$regex: query,
$options: "i",
},
},
],
},
},
{ $project: { _id: 1, fullname: 1, name: 1 } },
{
$addFields: {
type: {
$cond: [
{
$exist: "fullname",
},
"POSTS",
"USERS",
],
},
},
},
{ $skip: parseInt(skip) },
{ $limit: parseInt(limit) },
]);
Ответ №1:
Проблема заключалась в том, что у нас нет $exist
оператора агрегирования, поэтому мы делаем это с помощью $type
оператора (оператор exist query не может использоваться при агрегировании вне соответствия)
Запрос 1
- вы можете использовать это, если хотите, чтобы значение if
fullname
было ложным (напримерnull
, ,missing
,false
) для полученияUSERS
типа
aggregate([
{
"$set": {
"type": {
"$cond": [
"$fullname",
"USERS",
"POSTS"
]
}
}
}
])
Запрос 2
- вы можете использовать это, если хотите, только тогда, когда поле отсутствует
aggregate([
{
"$set": {
"type": {
"$cond": [
{
"$eq": [
{
"$type": "$fullname"
},
"missing"
]
},
"POSTS",
"USERS"
]
}
}
}
])