如何对MongoDB setWindowFields中当前文档以外的文档进行操作

eqqqjvef  于 2023-04-29  发布在  Go
关注(0)|答案(2)|浏览(130)

我有一个这样的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);

我期待着执行一个文件中的每个价格字段的操作(总和),最后的意思。例如x1+ x5处的平均值,x2 + x5处的平均值,...,x6 + x10处的平均值,x7 + x10处的平均值,...
就像我们在标准差公式中做的那样:价格与平均价格之差的平方和。
下面是预期输出的样子:

[
    {
      "_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)
    }
]
xxb16uws

xxb16uws1#

**编辑:**对于具有预期输出的更新问题:

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上的工作原理

**原题:**一个选项是添加另一个具有相反方向排序的$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上的工作原理

t1qtbnec

t1qtbnec2#

你在找这个吗:

db.collection.aggregate([
   {
      $setWindowFields: {
         sortBy: { _id: 1 },
         output: {
            mean: {
               $avg: "$price",
               window: { documents: [-4, 0] }
            }
         }
      }
   },
   {
      $setWindowFields: {
         sortBy: { _id: 1 },
         output: {
            sum: {
               $sum: "$price",
               window: { documents: [-4, 0] }
            },
            last_mean: {
              $last: "$mean",
               window: { documents: [-4, 0] }
            }
         }
      }
   }
])

相关问题