如何在MongoDB中合并结果和重新格式化
我有这样的文件:如何在MongoDB中合并结果和重新格式化,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有这样的文件: { "si" : "10.131.6.79", "sp" : 36158, "n" : "snat", "tsi" : "194.230.159.203", "tsp" : 36158, "di" : "205.185.208.165", "dp" : 443 } { "si" : "10.128.103.115", "sp" : 56261, "n" : "dnat", "tdi" : "
{
"si" : "10.131.6.79",
"sp" : 36158,
"n" : "snat",
"tsi" : "194.230.159.203",
"tsp" : 36158,
"di" : "205.185.208.165",
"dp" : 443
}
{
"si" : "10.128.103.115",
"sp" : 56261,
"n" : "dnat",
"tdi" : "194.230.159.107",
"tdp" : 56261,
"di" : "8.253.207.243",
"dp" : 443
}
我喜欢查询哪一个连接了几个匹配的结果。期望的结果是
{
"sourceIp" : "10.131.6.79",
"sourcePort" : 36158,
"trandisp" : "snat",
"sourceNatIp" : "194.230.159.203",
"sourceNatPort" : 36158,
"destIp" : "205.185.208.165",
"dp" : 443
}
{
"sourceIp" : "10.128.103.115",
"sourcePort" : 56261,
"trandisp" : "dnat",
"destinationNatIp" : "194.230.159.107",
"destinationNatPort" : 56261,
"destIp" : "8.253.207.243",
"destPort" : 443
}
原则上,我使用以下命令来管理它:
{ $concatArrays: [
db.sessions.aggregate([
{$match:{n:"snat"}},
{$project : {
_id : 0,sourceIp : "$si",sourcePort : "$sp",sourceNatIp : "$tsi",sourceNatPort : "$tsp", destIp : "$di",destPort : "$dp", trandisp: "$n"
}}
]),
db.sessions.aggregate([
{$match:{n:"dnat"}},
{$project : {
_id : 0,sourceIp : "$si",sourcePort : "$sp",destinationNatIp : "$tdi",destinationNatPort : "$tdp", destIp : "$di",destPort : "$dp" ,trandisp: "$n"
}}
])
] }
但我需要它作为查询结果,也就是说,我想创建一个视图
我会用SQL写
select
si as SourceIp, sp as SourcePort, n as transdisp,
tsi as SourceNatIp, tsp as SouceNatPort,
null as DestinationNatIp, null as DestinationNatPort
from sessions
where n = 'snat'
union all
select
si as SourceIp, sp as SourcePort, n as transdisp,
null as SourceNatIp, null as SouceNatPort,
tdi as DestinationNatIp, tdp as DestinationNatPort
from sessions
where n = 'dnat';
您可以尝试查看运算符,它允许您运行多个单独的查询,并将结果作为单个文档获取。然后,您可以运行和来组合和提升查询结果
db.sessions.aggregate([
{
$facet: {
q1: [
{ $match:{n:"snat"} },
{ $project : {
_id : 0,sourceIp : "$si",sourcePort : "$sp",sourceNatIp : "$tsi",sourceNatPort : "$tsp", destIp : "$di",destPort : "$dp", trandisp: "$n"
}}
],
q2: [
{ $match:{n:"dnat"}},
{ $project : {
_id : 0,sourceIp : "$si",sourcePort : "$sp",destinationNatIp : "$tdi",destinationNatPort : "$tdp", destIp : "$di",destPort : "$dp" ,trandisp: "$n"
}}
]
}
},
{
$project: {
all: {
$concatArrays: [ "$q1", "$q2" ]
}
}
},
{
$unwind: "$all"
},
{
$replaceRoot: {
newRoot: "$all"
}
}
])
您可以尝试查看运算符,它允许您运行多个单独的查询,并将结果作为单个文档获取。然后,您可以运行和来组合和提升查询结果
db.sessions.aggregate([
{
$facet: {
q1: [
{ $match:{n:"snat"} },
{ $project : {
_id : 0,sourceIp : "$si",sourcePort : "$sp",sourceNatIp : "$tsi",sourceNatPort : "$tsp", destIp : "$di",destPort : "$dp", trandisp: "$n"
}}
],
q2: [
{ $match:{n:"dnat"}},
{ $project : {
_id : 0,sourceIp : "$si",sourcePort : "$sp",destinationNatIp : "$tdi",destinationNatPort : "$tdp", destIp : "$di",destPort : "$dp" ,trandisp: "$n"
}}
]
}
},
{
$project: {
all: {
$concatArrays: [ "$q1", "$q2" ]
}
}
},
{
$unwind: "$all"
},
{
$replaceRoot: {
newRoot: "$all"
}
}
])
谢谢,它很管用。但是我不能使用它,因为我想创建一个视图。看起来MongoDB并没有在视图中使用索引,但是索引的使用是至关重要的,因为我的数据库将获得应用程序。5000亿份文件,谢谢你,这很有效。但是我不能使用它,因为我想创建一个视图。看起来MongoDB并没有在视图中使用索引,但是索引的使用是至关重要的,因为我的数据库将获得应用程序。5000亿份文件。