gpt4 book ai didi

MongoDB 聚合 : Project an array without the last element

转载 作者:可可西里 更新时间:2023-11-01 09:28:49 26 4
gpt4 key购买 nike

在 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());

谢谢你的帮助

最佳答案

shell 查询可以是这样的:

db.collection.aggregate([
{ $project: {
doc1: 1,
doc1_without_last: { $slice: [
"$doc1",
{ $subtract: [ { $size: "$doc1" }, 1 ] }
] }
} }
])

文档:

如果在 spring 中有任何限制不允许你构建这样的查询,你可以使用 $let使用查询变量:

db.collection.aggregate([
{ $project: {
doc1: 1,
doc1_without_last: { $let: {
vars: { size: { $subtract: [ { $size: "$doc1" }, 1 ] } },
in: { $slice: [ "$letters", "$$size"] }
} }
} }
])

关于MongoDB 聚合 : Project an array without the last element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47433758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com