根据非数组字段投影 mongo 文档中的数组值
Projecting array values in mongo document based on non array fields
我的数据库中的数据如下:
/* 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"
}
]
}
我想投影数据,以便根据 u_name
字段是否为空来更改结果中的 name
字段和 info
数组。我期望的结果如下所示:
/* 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"]}
}
}])
但我一直无法弄清楚如何根据 u_name
从第一个文档中的值为 "Severus" 的 info
中删除数组元素。这可能吗?
您可以尝试如下操作:
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']
}
}
}
}
}
])
我的数据库中的数据如下:
/* 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"
}
]
}
我想投影数据,以便根据 u_name
字段是否为空来更改结果中的 name
字段和 info
数组。我期望的结果如下所示:
/* 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"]}
}
}])
但我一直无法弄清楚如何根据 u_name
从第一个文档中的值为 "Severus" 的 info
中删除数组元素。这可能吗?
您可以尝试如下操作:
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']
}
}
}
}
}
])