【问题标题】:How to get average star rating value (native mongodb & express)如何获得平均星级值(原生 mongodb 和 express)
【发布时间】:2021-02-15 05:24:59
【问题描述】:

使用 Express,我在 MongoDb breakfast-tacos 中有一个集合,其中包含一个名为 rating: 的字段。尝试计算 rating 字段的平均值,即不大于 5 的数字。尝试 aggregate 但不断得到 TypeError: db.collection(...).aggregate(...).then is not a function。聚合管道/mongo 的新手,谁能举例说明如何正确使用本机 mongodb(不是 mongoose)获取平均值并给出解释?

我的代码:

    app.get('/breakfast-rating', (req, res) => {
        db.collection('breakfast-tacos').aggregate([{$group: { "_id": "$ObjectId"}, $avg: {"rating":"$rating" }}])
        .then(results => {
            res.send({ rating: results });
        })
        .catch(error => console.error(error))
    });

【问题讨论】:

    标签: javascript node.js mongodb express mern


    【解决方案1】:

    如果您只是想确定所有 rating 字段的平均值,您需要像这样简单的东西:

    db.collection.aggregate([
      {
        $group: {
          _id: "avg",
          avgrating: {
            $avg: "$rating"
          }
        }
      }
    ])
    

    所以你的代码应该是这样的:

        app.get('/breakfast-rating', (req, res) => {
            db.collection('breakfast-tacos').aggregate([
            {
              $group: {
                _id: "avg",
                avgrating: {
                  $avg: "$rating"
                }
              }
            }
          ])
            .then(results => {
                res.send({ rating: results[0].avgrating });
            })
            .catch(error => console.error(error))
        });
    

    Mongo 游乐场:https://mongoplayground.net/p/7zLr3E6FoLh

    【讨论】:

    • 我试过你的代码,但仍然得到相同的聚合不是函数错误。不知道为什么。
    • @JasonBryant 奇怪。 db.collection('breakfast-tacos').find(.. 会抛出类似的错误吗?
    • 我改为 .find() 并且是同样的错误。如果我用db.collection('breakfast-tacos').find({}).toArray() 替换它可以正常工作(全部返回)。
    • @JasonBryant 然后尝试对聚合执行相同的操作。显然,它没有返回一个承诺,所以then 不是一个函数。试试:db.collection('breakfast-tacos').aggreaget([...]).toArray()
    • @codemoney 非常有意义,现在问题解决了!在.toArray() 的注释中添加了上述代码,现在它可以正确返回。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2022-08-14
    • 2011-03-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多