我的数据库中有以下结构,我需要为所有孩子计算“Tripduration”并将其保存在“Tripcount”下,因为我每次旅行的持续时间都有一个条目:
{
"_id": 1,
"Tripcount": "This should be 5",
"Trips": [
{
"EndStationID": 2,
"Tripduration": [
43,
50,
45
]
},
{
"EndStationID": 3,
"Tripduration": [
52
]
},
{
"EndStationID": 4,
"Tripduration": [
34
]
}
我有以下查询,但它总是返回0.我是MongoDB语法的新手,希望有人看到它返回0的原因:
db.test.aggregate(
{
$group: {
_id: {"StationID": "$Start Station ID", "EndStationID": "$End Station ID"},
durations: {$addToSet: "$Trip Duration" },
}
},
{
$group: {
_id: "$_id.StationID",
Tripcount: {$sum: "durations"},
Trips: { $addToSet: { EndStationID: "$_id.EndStationID", Tripduration: "$durations"} }
}
}
)
答案 0 :(得分:2)
您可以使用聚合框架执行此操作。
您需要将$add
表达式应用于“Tripduration”$size
数组,并使用$reduce
运算符组合该值。
当然要获得“Tripduration”大小的数组,你需要使用$map
数组运算符
db.trip.aggregate(
[
{
"$addFields":{
"Tripcount":{
"$reduce":{
"input":{
"$map":{
"input":"$Trips",
"in":{
"$size":"$$this.Tripduration"
}
}
},
"initialValue":0,
"in":{
"$add":[
"$$value",
"$$this"
]
}
}
}
}
}
]
)
在集合中保持更改持久,只需将$out
管道添加到舞台
{ "$out": "trip" }
但请注意,这会覆盖您的收藏或创建一个新的
答案 1 :(得分:1)
您可以使用$reduce
连接数组,然后在3.4版本上使用$size
。
db.test.aggregate(
[{
$addFields: {
"Tripcount": {
$size: {
$reduce: {
input: "$Trips.Tripduration",
initialValue: [],
in: {
$concatArrays: ["$$value", "$$this"]
}
}
}
}
}
}]
)
参考:https://docs.mongodb.com/manual/reference/operator/aggregation/reduce/