我有一个这样的MongoDB集合:

[
  {
    "_id": 1,
    "price": 1
  },
  {
    "_id": 2,
    "price": 2
  },
  {
    "_id": 3,
    "price": 3
  },
  {
    "_id": 4,
    "price": 4
  },
  {
    "_id": 5,
    "price": 5
  },
  {
    "_id": 6,
    "price": 6
  }
]

我想自己计算标准差(我知道有一个内置的运算符,但我想更改一些参数,所以我自己实现它).

我计算了连续平均值,但如何使用setWindowFields阶段中的最后一个平均值:

const aggregation1 = [
    {
        $setWindowFields: {
            sortBy: {
                _id: 1
            },
            output: {
                mean: {
                    $avg: "$price",
                    window: {
                        documents: [-4, 0]
                    }
                }
            }
        }
    },
    {
        $setWindowFields: {
            sortBy: {
                _id: 1
            },
            output: {
                field_new: {
                    $sum: [
                        "$price",
                        { $last: "$mean" } //Gives error
                    ],
                    window: {
                        documents: [-4, 0]
                    }
                }
            }
        }
    }
];
db.collection.aggregate(aggregation);

我希望执行一个文件中的每个价格字段(总和)上的操作,与最后的手段. 例如,x5的x1+平均值、x5的x2+平均值、x10的x6+平均值、x10的x7+平均值、……

就像我们在标准差公式中所做的那样:价格和平均价格之间差值的平方之和.

以下是预期输出应该是什么样子:

[
    {
      "_id": 1,
      "price": 1
    },
    {
      "_id": 2,
      "price": 2
    },
    {
      "_id": 3,
      "price": 3
    },
    {
      "_id": 4,
      "price": 4
    },
    {
      "_id": 5,
      "price": 5,
      "field_new": 8 // 5 + 3 (3=(1+2+3+4+5)/5 mean from last 5 docs)
    },
    {
      "_id": 6,
      "price": 6,
      "field_new": 10 // 6 + 4 (4=(2+3+4+5+6)/5 mean from last 5 docs)
    }
]

推荐答案

EDIT:对于具有预期输出的更新后的问题:

db.collection.aggregate([
  {$setWindowFields: {
      sortBy: {_id: 1},
      output: {
        mean: {
          $push: "$price",
          window: {documents: [-N, 0]}
        }
      }
  }},
  {$set: {
      mean: "$$REMOVE",
      field_new: {
        $cond: [
          {$gt: [{$size: "$mean"}, N]},
          {$add: ["$price", {$avg: "$mean"}]},
          "$$REMOVE"
        ]
      }
  }}
])

看看它在playground example号公路上是如何工作的

**原问题:** 一种 Select 是添加另一个具有相反方向排序的$setWindowFields步:

db.collection.aggregate([
  {$setWindowFields: {
      sortBy: {_id: 1},
      output: {
        mean: {
          $avg: "$price",
          window: {documents: [-4, 0]}
        }
      }
  }},
  {$setWindowFields: {
      sortBy: {_id: -1},
      output: {
        lastMean: {
          $first: "$mean",
          window: {documents: ["unbounded", "current" ]}
        }
      }
  }}
])

看看它在playground example号公路上是如何工作的

Mongodb相关问答推荐

$mod只支持数字类型,不支持MongoDb中的array和int

如何在MongoSH中的现有文档中插入字段

MongoDB 在一个聚合中包含多个组

通过 docker 运行的 MongoDB 服务器无法互相看到(名称解析中的临时故障)

没有mongoose 的 Express 和 MongoDB

mongoDB vs mySQL - 为什么在某些方面比另一个更好

类型错误:db.close is not a function

Mongo 无法启动

将MongoDB连接到前端?

指定字段对于 MongoDB 是transient瞬态的,但对于 RestController 不是

Node.js 数据库的抽象层

Select 匹配mongodb中两个字段的concat值的记录

如何使用 -number 后缀对字符串进行 MongoDB 查询排序?

`fields cannot be identical'和''` mongoimport错误

有没有办法将python对象直接存储在mongoDB中而不序列化它们

MongoDB 查找精确的数组匹配,但顺序无关紧要

Spring Data MongoDB 中的独特之处

Java Mongodb 正则表达式查询

指定在 mongodb .js 脚本中使用哪个数据库

用于 MongoDB 的 Node.js 模块