在MongoDB 4中,我正在使用一个包含包含数字的文档文档的集合。我想对所有这些数字求和。
查询现在哪一个只是散出整个文档:
db.metadata.aggregate([
{
$match:{
"download-md5-checksum":"419f21233097c5f7bcd937a2c94b8032"
}
},
{
$group:{
_id:"$xled.xled-bad-counts",
count:{
$sum:1
}
}
},
{
$project:{
"xled.xled-bad-counts":"$_id",
count:1,
_id:0
}
}
]).pretty()
{
"count" : 1,
"xled" : {
"xled-bad-counts" : {
"left-engine-accessory-gearbox-count" : 7,
"left-engine-accessory-gearbox-minimum" : 2,
"left-engine-accessory-gearbox-maximum" : 2,
"left-engine-accessory-gearbox-total" : 3
}
}
}
我了解$sum
函数,但是我相信它想作用于数组,但是我的数据作为文档的文档排列。
如何使用MongoDB Shell命令正确地对此进行汇总并进行求和?我希望我的输出只是
{count: 453}
答案 0 :(得分:1)
您需要$objectToArray运算符来汇总来自“未知”键的数据,然后可以将此值传递给$sum运算符,因为function repairAndRelaunch (cnt) {
// capture current secs
var secs = (new Date()).getSeconds();
// relaunch with corrected seconds - limit iterations for testing
if (5 > cnt++) setTimeout('repairAndRelaunch(' + cnt + ')', (60-secs)*1000);
// log to observe discrepencies
console.log('for cnt = ' + cnt + ', secs = ' + secs);
};
// test control flow
window.onload = function() {repairAndRelaunch(0);};
下将有一个数字数组。 $let在此处用于定义一个临时变量,然后可以将其传递给xled.v
函数
$sum
输出:db.metadata.aggregate([
{
$project:{
_id: 0,
count: {
$let: {
vars: { xled: { $objectToArray: "$xled.xled-bad-counts" } },
in: { $sum: "$$xled.v" }
}
}
}
}
]).pretty()