Данные в моей базе следующие:
/* 1 */
{
"name": "Severus",
"u_name": "severussnape",
"info": [
{
"value": "Severus",
"source": "1",
"infotag": "name"
},
{
"value": "severussnape",
"source": "2",
"infotag": "name"
}
]
}
/* 2 */
{
"name": "Harry",
"u_name": null,
"info": [
{
"value": "Harry",
"source": "1",
"infotag": "name"
}
]
}
Я хотел бы проецировать данные так, чтобы поле name и массив info в результате изменялись в зависимости от того, является ли поле u_name нулевым. Ожидаемый результат выглядит так:
/* 1 */
{
"name": "severussnape",
"info": [
{
"value": "severussnape",
"source": "2",
"infotag": "name"
}
]
}
/* 2 */
{
"name": "Harry",
"info": [
{
"value": "Harry",
"source": "1",
"infotag": "name"
}
]
}
Мне удалось правильно спроецировать поле имени, используя проекцию:
db.database.aggregate([{
$project:{
"name":{$cond:[{$eq:["$u_name",null]},"$name","$u_name"]}
}
}])
Но я не смог понять, как удалить элемент массива из info со значением «Северус» в первом документе в зависимости от u_name. Это возможно?
@Jitendra, извините, я не ясно выразился. Элемент массива с именем «Северус» (или из источника 1, если быть шире) необходимо удалить, если поле u_name не равно нулю.

Вы можете попробовать что-то вроде ниже:
db.database.aggregate([
{
$project:{
"name":{ $cond: { if: { $eq:["$u_name",null] }, then: "$name", else: "$u_name" } },
}
},
])
Это эквивалентно запросу, который я предоставил в своем вопросе, если я не ошибаюсь.
Это полезно?
если любое условие нужно. Вы можете соответствовать этому.
db.getCollection('TestQueries').aggregate([
{$unwind:{
path:"$info",
preserveNullAndEmptyArrays:true
}},
{$project:{
name:"$info.value",
info:1
}}
])
Вы должны попробовать этот совокупный запрос, это решит вашу проблему.
db.database.aggregate([
{
$project:{
'name': {
'$ifNull': ['$u_name', '$name']
},
'info': '$info'
}
},
{
$project: {
'name': '$name',
'info': {
'$filter': {
'input': '$info',
'as': 'info',
'cond': {
'$eq':['$$info.value', '$name']
}
}
}
}
}
])
Вы можете получить желаемые результаты с помощью $unwind, но я до сих пор не понимаю, как именно вы хотите удалить поддокумент с именем «Северус».