我有一个包含以下对象的数据库结构:
"reactions": {
"?": [
"5f3c569e70441a0017511fe2",
"5f88d49dbf1b850017e28f4e",
"5f488189b0c5970017aa8c7a"
],
"?": [
"5f539086cfb52a00176089ed"
]
}
我希望能够计算“反应数”(所有嵌套元素的总数)-因此,在这种情况下,预期结果将为4。
我尝试了以下操作,这成功地计算了键的数量-结果为2,而不是值的总数-应该为4。
db.collection("posts").aggregate([{
{
$addFields: {
reactionsArray: {
$objectToArray: "$reactions"
}
}
},
{
$addFields: {
numberOfReactions: {
$sum: {
$size: "$reactionsArray.v"
}
}
}
}
])
答案 0 :(得分:2)
使用$reduce对数组中每个元素的大小求和。
db.collection.aggregate([
{
$addFields: {
reactionsArray: {
$objectToArray: "$reactions"
}
}
},
{
"$project": {
reactionsSize: {
$reduce: {
input: "$reactionsArray",
initialValue: 0,
in: {
"$add": [
"$$value",
{
$size: "$$this.v"
}
]
}
}
},
},
}
])
答案 1 :(得分:1)
您必须先$ {unwind reactionsArray
,然后使用$ group来获取总数
db.collection.aggregate([
{
$addFields: {
reactionsArray: {
$objectToArray: "$reactions"
}
}
},
{
$unwind: "$reactionsArray"
},
{
$group: {
_id:"$_id",
numberOfReactions: {
$sum: {
$size: "$reactionsArray.v"
}
}
}
}
])