【问题标题】:How to combine Documents in aggregation pipeline with MongoDB Java driver 3.6?如何将聚合管道中的文档与 MongoDB Java 驱动程序 3.6 结合起来?
【发布时间】:2018-07-15 13:48:10
【问题描述】:

我正在使用 MongoDB Java 驱动程序 3.6 版的聚合管道。如果我的文档看起来像:

doc1 --

{
  "CAR": {
    "VIN": "ASDF1234",
    "YEAR": "2018",
    "MAKE": "Honda",
    "MODEL": "Accord"
  },
  "FEATURES": [
    {
      "AUDIO": "MP3",
      "TIRES": "All Season",
      "BRAKES": "ABS"
    }
  ]
}

doc2 --

{
  "CAR": {
    "VIN": "ASDF1234",
    "AVAILABILITY": "In Stock"
  }
}

如果我提交如下查询:

collection.aggregate(
    Arrays.asList(
        Aggregates.match(
            and(
                in("CAR.VIN", vinList),
                or(
                    eq("CAR.MAKE", carMake),
                    eq("CAR.AVAILABILITY", carAvailability),
                )
            )
        )
    )
)

让我们假设恰好有两个不同的记录,“CAR.VIN”标准与每个 VIN 匹配,我将得到两个结果。而不是每次处理两个结果,我想合并文档,使结果看起来像这样:

{
  "CAR": {
    "VIN": "ASDF1234",
    "YEAR": "2018",
    "MAKE": "Honda",
    "MODEL": "Accord",
    "AVAILABILITY": "In Stock"
  },
  "FEATURES": [
    {
      "AUDIO": "MP3",
      "TIRES": "All Season",
      "BRAKES": "ABS"
    }
  ]
}

我有两个且只有两个结果的示例使我对此的需求变得微不足道。想象一下 vinList 是一个包含 10000 个值的列表,它可能会返回 2 x 10000 个文档。当我向调用我的代码的客户端返回一个 AggregateIterable 时,我不想强​​加他们必须以任何方式对结果进行分组或整理的要求,但他们将收到一个包含所有结果的文档他们想要干净、轻松地解析的信息。

当然,人们会建议将数据与 MongoDB 集合中的所有数据简单地组合到一个文档中。由于我无法控制的原因,同一集合中的每个 VIN 都有两个单独的文档,这是我无法更改的。在我们的系统中有一个价值使得这比看起来更合理,所以请不要把注意力集中在数据的这个明显问题上。

我正在尝试利用 Aggretes.group() 操作来合并聚合管道中的字段,但运气不佳。 Accumulators.push 似乎是最接近我需要的操作,但我不想用额外的数组等使文档结构复杂化。有没有我没有看到的简单方法?

【问题讨论】:

    标签: mongodb aggregation-framework mongodb-java


    【解决方案1】:

    你可以试试在 mongo v3.6 中添加的$mergeObjects

    db.cc.aggregate(
        [
            {
                $group: {
                    _id : "$CAR.VIN", 
                    CAR : {$mergeObjects : "$CAR"}, 
                    FEATURES : {$mergeObjects : {$arrayElemAt : ["$FEATURES", 0 ]}}
                }
            }
        ]
    ).pretty()
    

    结果

    {
        "_id" : "ASDF1234",
        "CAR" : {
            "VIN" : "ASDF1234",
            "YEAR" : "2018",
            "MAKE" : "Honda",
            "MODEL" : "Accord",
            "AVAILABILITY" : "In Stock"
        },
        "FEATURES" : {
            "AUDIO" : "MP3",
            "TIRES" : "All Season",
            "BRAKES" : "ABS"
        }
    }
    > 
    

    以数组形式获取特征

    db.cc.aggregate(
        [
            {
                $group: {
                    _id : "$CAR.VIN", 
                    CAR : {$mergeObjects : "$CAR"}, 
                    FEATURES : {$push : {$arrayElemAt : ["$FEATURES", 0 ]}}
                }
            }
        ]
    ).pretty()
    

    结果

    {
        "_id" : "ASDF1234",
        "CAR" : {
            "VIN" : "ASDF1234",
            "YEAR" : "2018",
            "MAKE" : "Honda",
            "MODEL" : "Accord",
            "AVAILABILITY" : "In Stock"
        },
        "FEATURES" : [
            {
                "AUDIO" : "MP3",
                "TIRES" : "All Season",
                "BRAKES" : "ABS"
            },
            null
        ]
    }
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2017-06-18
      • 2021-11-16
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多