[英]How to combine Documents in aggregation pipeline with MongoDB Java driver 3.6?
我在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都符合“ CAR.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似乎是最接近我需要的操作,但是我不想使文档结构与多余的数组等复杂化。是否有我没有看到的简单方法?
您可以尝试在mongo $mergeObjects
添加的$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
]
}
>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.