【问题标题】:How to count all documents, count unique fields and sum in same query with Mongoose?如何使用 Mongoose 在同一查询中计算所有文档、计算唯一字段并求和?
【发布时间】:2022-01-25 22:14:23
【问题描述】:

我有一个这样的地址模型:

const AddressSchema = new Schema({
    address: String,
    city: String,
    postal_code: String,
    country: String,
    user_id: String,
    postalCodeMeters: Number,
});

我想知道(对于某个邮政编码的某个用户):

  • 访问了多少个唯一地址
  • 用户访问此邮政编码的次数
  • 他们走了多少米

此代码有效,但我想在一个查询中完成,而不是两个:

addressrouter.get("/isexplored/:userid/:postalcode",
    async (req, res) => {
      console.log(req.params.userid)
      try {
        const addresses = await Address.aggregate(
          [
            { $match:{
              user_id: req.params.userid,
              postal_code: req.params.postalcode
            }},
            {$group: {
              _id: null,
              meters: {$sum: "$postalCodeMeters"},
              count: { $sum: 1 }
            }
          }]
        )
        console.log(addresses)
        const uniqueAddresses = (await Address.find(
          {
            user_id: req.params.userid,
            postal_code: req.params.postalcode
          }
        ).distinct('address')).length
        res.json({
          time: addresses[0].count,
          uniqueAddressesVisited: uniqueAddresses,
          meters: addresses[0].meters
        });
      } catch (err) {
        console.log(err)
        res.json({ message: err });
      }
    }
  )

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    如果我理解正确,您可以在单个 $group 操作中完成。

    检查这个查询,在$group 阶段使用$addToSet,我们可以获得唯一值。然后在项目中使用$size 以了解长度。

    Address.aggregate([
      {
        "$match": {
          "user_id": req.params.userid,
          "postal_code": req.params.postalcode
        }
      },
      {
        "$group": {
          "_id": null,
          "meters": {
            "$sum": "$postalCodeMeters"
          },
          "count": {
            "$sum": 1
          },
          "address": {
            "$addToSet": "$address"
          }
        }
      },
      {
        "$project": {
          "_id": 0,
          "count": 1,
          "meters": 1,
          "uniqueAddressesVisited": {
            "$size": "$address"
          }
        }
      }
    ])
    

    例如here

    【讨论】:

    • 非常感谢,就像一个魅力。有没有一种简单的方法可以通过单个查询获取每个邮政编码的数据,或者这个问题太大了?这意味着我会将邮政编码作为参数删除,但仍然会获得相同的数据,只是针对每个邮政编码。
    • 你的意思是like this。没有$match(获取所有postal_code)和$group postal_code 本身?
    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多