如何将聚合管道中的文档与 MongoDB Java 驱动程序 3.6 结合?
How to combine Documents in aggregation pipeline with MongoDB Java driver 3.6?
我正在使用 MongoDB Java 驱动程序版本 3.6 的聚合管道。如果我有类似于以下内容的文档:
文档 1 --
{
"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),
)
)
)
)
)
让我们假设恰好有两个不同的记录,每个 VIN 的 "CAR.VIN" 条件都匹配,我将得到两个结果。我不想每次都处理两个结果,而是想合并文档以便结果如下所示:
{
"CAR": {
"VIN": "ASDF1234",
"YEAR": "2018",
"MAKE": "Honda",
"MODEL": "Accord",
"AVAILABILITY": "In Stock"
},
"FEATURES": [
{
"AUDIO": "MP3",
"TIRES": "All Season",
"BRAKES": "ABS"
}
]
}
我有两个且只有两个结果的示例使我对此的需求变得微不足道。假设 vinList 是一个包含 10000 个值的列表,它可能 return 2 x 10000 个文档。当我向调用我的代码的客户端 return 一个 AggregateIterable 时,我不想强加要求他们必须以任何方式对结果进行分组或整理,但他们将为每个结果收到一个文档拥有他们想要清晰、轻松地解析的所有信息。
当然,人们会建议将数据与 MongoDB 集合中的所有数据简单地合并到一个文档中。由于我无法控制的原因,同一集合中的每个 VIN 对应两个单独的文件,这是我无法更改的。我们的系统中有一个值使这比看起来更合理,所以请不要关注这个明显的数据问题。
我正在尝试利用 Aggretes.group() 操作合并我的聚合管道中的字段,但运气不佳。 Accumulators.push 似乎是最接近我需要的操作,但我不想用额外的数组等使文档结构复杂化。有没有一种我没有看到的直接方法?
你可以尝试 $mergeObjects
添加到 mongo v3.6
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
]
}
>
我正在使用 MongoDB Java 驱动程序版本 3.6 的聚合管道。如果我有类似于以下内容的文档:
文档 1 --
{
"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),
)
)
)
)
)
让我们假设恰好有两个不同的记录,每个 VIN 的 "CAR.VIN" 条件都匹配,我将得到两个结果。我不想每次都处理两个结果,而是想合并文档以便结果如下所示:
{
"CAR": {
"VIN": "ASDF1234",
"YEAR": "2018",
"MAKE": "Honda",
"MODEL": "Accord",
"AVAILABILITY": "In Stock"
},
"FEATURES": [
{
"AUDIO": "MP3",
"TIRES": "All Season",
"BRAKES": "ABS"
}
]
}
我有两个且只有两个结果的示例使我对此的需求变得微不足道。假设 vinList 是一个包含 10000 个值的列表,它可能 return 2 x 10000 个文档。当我向调用我的代码的客户端 return 一个 AggregateIterable 时,我不想强加要求他们必须以任何方式对结果进行分组或整理,但他们将为每个结果收到一个文档拥有他们想要清晰、轻松地解析的所有信息。
当然,人们会建议将数据与 MongoDB 集合中的所有数据简单地合并到一个文档中。由于我无法控制的原因,同一集合中的每个 VIN 对应两个单独的文件,这是我无法更改的。我们的系统中有一个值使这比看起来更合理,所以请不要关注这个明显的数据问题。
我正在尝试利用 Aggretes.group() 操作合并我的聚合管道中的字段,但运气不佳。 Accumulators.push 似乎是最接近我需要的操作,但我不想用额外的数组等使文档结构复杂化。有没有一种我没有看到的直接方法?
你可以尝试 $mergeObjects
添加到 mongo v3.6
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
]
}
>