我的数据库中的数据如下:
/* 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
第一个文档中的值“Severus”中删除数组元素,具体取决于u_name
. 这可能吗?
您应该尝试此聚合查询,这将解决您的问题。
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']
}
}
}
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句