首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB聚合$divide

MongoDB聚合$divide
EN

Stack Overflow用户
提问于 2021-07-14 10:47:07
回答 1查看 29关注 0票数 0

我是javascript的新手。我想计算平均销售额(averageSales = totalSales/ numOrders)。然而,我遇到了一些困难。如果有任何帮助或指导,我将非常感激。

代码语言:javascript
复制
const averageSale = await Order.aggregate([
        {
          $group: {
            _id: null,
            totalSales: { $sum: '$totalPrice' },
            numOrders: { $sum: 1 },
          },
        },
        {$project:{totalSales:1, numOrders:1, averagesale: { $divide: ['$totalSales', '$numOrders']}}},
      ]);

以下是我的一些文档

代码语言:javascript
复制
import express from 'express';
import expressAsyncHandler from 'express-async-handler';
import Order from '../models/orderModel.js';
import User from '../models/userModel.js';
import Product from '../models/productModel.js';
import { isAdmin, isAuth } from '../utils.js';



const orderRouter = express.Router();
orderRouter.get(
    '/',
    isAuth,
    isAdmin,
    expressAsyncHandler(async (req, res) => {
      const orders = await Order.find({}).populate('user', 'name');
      res.send(orders);
    })
  );
orderRouter.get(
    '/mine',
    isAuth,
    expressAsyncHandler(async (req, res) => {
      const orders = await Order.find({ user: req.user._id });
      res.send(orders);
    })
  );
  
  orderRouter.get(
    '/summary',
    isAuth,
    isAdmin,
    expressAsyncHandler(async (req, res) => {
      const orders = await Order.aggregate([
        {
          $group: {
            _id: null,
            numOrders: { $sum: 1 },
            totalSales: { $sum: '$totalPrice' },
          
          },
        },
      ]);
      const users = await User.aggregate([
        {
          $group: {
            _id: null,
            numUsers: { $sum: 1 },
          },
        },
      ]);
      const dailyOrders = await Order.aggregate([
        {
          $group: {
            _id: { $dateToString: { format: '%Y-%m-%d', date: '$createdAt' } },
            orders: { $sum: 1 },
            sales: { $sum: '$totalPrice' },
          },
        },
        { $sort: { _id: 1 } },
      ]);
      const productCategories = await Product.aggregate([
        {
          $group: {
            _id: '$category',
            count: { $sum: 1 },
          },
        },
      ]);

      const productName = await Product.aggregate([
        {
          $group: {
            _id: '$name',
            count: { $sum: 1 },
          },
        },
      ]);

      const productBy = await Product.aggregate([
        {
          $group: {
            _id: '$qty',
            count: { $sum: 1 },
            name: { $sum: '$name' },
          },
        },
      ]);

      const averageSale = await Product.aggregate([
        {
          $group: {
            _id: null,
            totalSales: { $sum: '$totalPrice' },
            numOrders: { $sum: 1 },
          },
        },
        {$project:{totalSales:1, orders:1, averagesale: { $divide: ['$totalSales', '$numOrders']}}},
      ]);
      
      res.send({ users, orders, dailyOrders, productCategories, productName, productBy, averageSale });
    })
  );
代码语言:javascript
复制
import mongoose from 'mongoose';

const orderSchema = new mongoose.Schema(
  {
    orderItems: [
      {
        name: { type: String, required: true },
        qty: { type: Number, required: true },
        image: { type: String, required: true },
        price: { type: Number, required: true },
        product: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Product',
          required: true,
        },
      },
    ],
    shippingAddress: {
      fullName: { type: String, required: true },
      address: { type: String, required: true },
      city: { type: String, required: true },
      postalCode: { type: String, required: true },
      country: { type: String, required: true },
    },
    paymentMethod: { type: String, required: true },
    paymentResult: {
        id: String,
        status: String,
        update_time: String,
        email_address: String,
      },
    itemsPrice: { type: Number, required: true },
    shippingPrice: { type: Number, required: true },
    taxPrice: { type: Number, required: true },
    totalPrice: { type: Number, required: true },
    user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
    isPaid: { type: Boolean, default: false },
    paidAt: { type: Date },
    isDelivered: { type: Boolean, default: false },
    deliveredAt: { type: Date },
  },
  {
    timestamps: true,
  }
);
const Order = mongoose.model('Order', orderSchema);
export default Order;
EN

回答 1

Stack Overflow用户

发布于 2021-07-14 14:32:31

我假设你正在尝试找到平均销售价格,没有必要使用$divide,因为$avg可以完成这项工作。

如果这不是你要找的,我可以知道你说的calculate the average number of sales (averageSales = totalSales/ numOrders)是什么意思吗?

代码语言:javascript
复制
db.collection.aggregate({
  "$group": {
    "_id": null,
    "totalSales": {
      $sum: "$totalPrice"
    },
    "numOrders": {
      $sum: 1
    },
    "avgPrice": {
      "$avg": "$totalPrice"
    }
  }
})

Mongo Playground

Official Documentation

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68371386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档