MongoDB:将具有相同值的不同字段分组

时间:2020-05-06 12:39:49

标签: mongodb mongoose mongodb-query aggregation-framework

我需要对mongodb集合执行汇总。但是我找不到正确的聚合管道。

实际上,field1 == field2(字段1与字段2不在同一文档中)时,我需要获取不同文档的ID。

例如,当源与目标相同时,我想查找所有文档:document1.fieldX == document2.fieldY

有关通过端口号查找目标服务器的信息。

示例文档:

[ 
  {
    id: 444,
    name: 'Server 1'
    portSource: 1,
    portTarget: 7,
  },
  {
    id: 555,
    name: 'Server 2'
    portSource: 7,
    portTarget: 1
  },
  {
    id: 666,
    name: 'Server 3'
    portSource: 1,
    portTarget: 8
  },
   {
    id: 777,
    name: 'Server 4'
    portSource: 3,
    portTarget: 5
  },
 {
    id: 888,
    name: 'Server 5'
    portSource: 5,
    portTarget: 3
  },
]

所需的输出:

[
 {
  portSource: 1, portTarget: 7, sourceId : 444, targetId: 555
 },
 {
  portSource: 3, portTarget: 5, sourceId : 777, targetId: 888
 }
]


编辑:

注释1 :未返回带有id: 666的服务器,因为其他任何服务器都与其目标端口相匹配。

注释2 :正确的输出也可以像这样:

(反向目标/源)

[
 {
  portSource: 7, portTarget: 1, sourceId : 555, targetId: 444
 },
 {
  portSource: 5, portTarget: 3, sourceId : 888, targetId: 777
 }
]

或者它可以包含两次(正常方式和相反方式):

[
 {
  portSource: 1, portTarget: 7, sourceId : 444, targetId: 555
 },
 {
  portSource: 7, portTarget: 1, sourceId : 555, targetId: 444
 },
 {
  portSource: 3, portTarget: 5, sourceId : 777, targetId: 888
 },
 {
  portSource: 5, portTarget: 3, sourceId : 888, targetId: 777
 }
]

1 个答案:

答案 0 :(得分:0)

您需要在同一集合上尝试$lookup聚合管道阶段:

pod install

测试: mongoplayground