【发布时间】:2018-05-06 03:16:14
【问题描述】:
在spring Data中使用聚合管道,我有嵌套数组的文档,我想投影一个数组,除了它的最后一项。 例如对于每个文档,例如:
{
"_id" : ObjectId("59ce411c2708c97154d13150"),
"doc1" : [
{
"nodeValue" : "AAA"
},
{
"nodeValue" : "BBB"
},
{
"nodeValue" : "CCC"
},
{
"nodeValue" : "DDD"
}
],
"field2" : 20170102,
"field3" : 4,
}
我想要结果:
{
"_id" : ObjectId("59ce411c2708c97154d13150"),
"doc1" : [
{
"nodeValue" : "AAA"
},
{
"nodeValue" : "BBB"
},
{
"nodeValue" : "CCC"
},
{
"nodeValue" : "DDD"
}
],
"doc1_without_last" : [
{
"nodeValue" : "AAA"
},
{
"nodeValue" : "BBB"
},
{
"nodeValue" : "CCC"
}
],
"field2" : 20170102,
"field3" : 4,
}
我尝试了类似的方法,但没有找到可以 $pop 数组并从中删除最后一项的运算符。
Aggregation agg = Aggregation.newAggregation(
Aggregation.project()
.andInclude("doc1","field2","field3"),
Aggregation.project().and(ArrayOperators.arrayOf("doc1")..).as("doc1_without_last")
new OutOperation("newCollection")
).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
感谢您的帮助
【问题讨论】:
-
那里有一个
$slice。 -
$slice只是控制要投影的数组的项目数。$slice(-n)仅投射最后 n 个元素,$slice(n)投射前 n 个元素。但是如何投影除最后一个之外的数组的所有数据。 -
对不起,忘了说还有
$size。除了最后一个是$slice($size - 1)。以防万一docs.mongodb.com/manual/reference/operator/aggregation-array 拥有所有这些。 -
java中的管道
$slice中的spring数据没有办法做到这一点,只得到一个数字整数参数。我的想法是反转数组以简单地将最后一个作为第一个像这样.and(ArrayOperators.arrayOf(doc1).reverse()).as("Reversed_doc1)但是如何从投影中排除Reversed_doc1.0.nodeValue -
我很确定您可以使用服务器端计算的
$size - 1构建自定义 $slice,请参阅 stackoverflow.com/questions/39393672/… 以获得灵感
标签: mongodb aggregation-framework aggregation mongodb-java spring-mongodb