Node.js 猫鼬和得到堆叠

Node.js 猫鼬和得到堆叠,node.js,mongodb,express,mongoose,nosql,Node.js,Mongodb,Express,Mongoose,Nosql,我试图在mongoDB上做一个微不足道的总数来计算单个客户机的价格 我的收藏: {"_id":"5d973c71dd93adfbda4c7272","name":"Faktura2019006","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":999999,"userId":"123"}, {"_id":"5d9e07e0b9676069c8b5e15d","name":"

我试图在mongoDB上做一个微不足道的总数来计算单个客户机的价格

我的收藏:

{"_id":"5d973c71dd93adfbda4c7272","name":"Faktura2019006","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":999999,"userId":"123"},
{"_id":"5d9e07e0b9676069c8b5e15d","name":"Faktura2019007","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":888,"userId":"123"}
// invoice.model.js
const mongoose = require("mongoose");

const InvoiceSchema = mongoose.Schema({
  _id: String,
  name: String,
  client: String,
  userId: String,
  expiration: Date,
  price: Number
});

module.exports = mongoose.model("Invoice", InvoiceSchema, "invoice");
我的尝试:

{"_id":"5d973c71dd93adfbda4c7272","name":"Faktura2019006","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":999999,"userId":"123"},
{"_id":"5d9e07e0b9676069c8b5e15d","name":"Faktura2019007","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":888,"userId":"123"}
// invoice.model.js
const mongoose = require("mongoose");

const InvoiceSchema = mongoose.Schema({
  _id: String,
  name: String,
  client: String,
  userId: String,
  expiration: Date,
  price: Number
});

module.exports = mongoose.model("Invoice", InvoiceSchema, "invoice");

发生了什么:

{"_id":"5d973c71dd93adfbda4c7272","name":"Faktura2019006","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":999999,"userId":"123"},
{"_id":"5d9e07e0b9676069c8b5e15d","name":"Faktura2019007","clientId":"5d9c87a6b9676069c8b5e15b","expiration":"2019-10-02T01:11:18.965Z","price":888,"userId":"123"}
// invoice.model.js
const mongoose = require("mongoose");

const InvoiceSchema = mongoose.Schema({
  _id: String,
  name: String,
  client: String,
  userId: String,
  expiration: Date,
  price: Number
});

module.exports = mongoose.model("Invoice", InvoiceSchema, "invoice");
当我现在打开一个浏览器,上面的代码被调用时,我在终端中得到了控制台日志“计算收入”,但在浏览器中它只是永远加载,什么也没发生


很可能我只是错过了一些愚蠢的小事情,但我一直在努力寻找答案,但没有成功,因此欢迎提供任何建议。

控制器无法完成的原因是您没有结束响应过程(这意味着,您需要使用
res
对象并将一些内容发送回调用方)

为了获得聚合值,还需要执行管道(请参阅)

此外,正如有人在评论中指出的那样,您需要在组中添加
\u id:null
,以指定不按任何特定字段分组(请参阅)

最后,在
$sum
操作符中,对于您尝试执行的操作,您只需要删除数组括号,因为您只想对单个字段求和(请参阅)

以下是修改后的代码:

// invoice.controller.js
const Invoice = require("../models/invoice.model.js");

exports.income = (req, res) => {
  console.log("Counting Income");

  Invoice.aggregate([
    {
      $match: {
        userId: "123"
      }
    },
    {
      $group: {
        _id: null,
        total: { $sum: "$price" }
      }
    }
  ]).then((response) => {
    res.json(response);
  });
};
编辑以获取有关何时返回空数组的注释

如果您希望始终返回相同类型的对象,我将在控制器中控制它。我不确定是否有一种奇特的方法可以在mongo中使用聚合管道实现这一点,但这就是我要做的

 Invoice.aggregate([
    {
      $match: {
        userId: "123"
      }
    },
    {
      $group: {
        _id: null,
        total: { $sum: "$price" }
      }
    },
    {
      $project: {
        _id: 0,
        total: "$total"
      }
    }
  ]).then((response) => {
    if (response.length === 0) {
      res.json({ total: 0 });
    } else {
      // always return the first (and only) value
      res.json(response[0]);
    }
  });
在这里,如果您找到
123
userId
,那么您将得到以下返回:

{
    "total": 1000887
}
但是,如果您将
用户ID
更改为数据库中不存在的
1123
,则结果将是:

{
    "total": 0
}
这样,您的客户机可以始终使用相同类型的对象


另外,我之所以将
$project
管道阶段放在那里,是为了抑制
\u id
字段(请参见)。

您没有从控制器返回任何内容(从控制器发送res),这就是为什么api根本没有返回任何内容,而不是关于不返回,它继续加载:)所以我的问题不是我没有得到响应,问题是fetch never endschange group到{$group:{{U id:null,total:{$sum:“$price”}},然后try@sushantmehta没有什么改变谢谢你,约瑟夫,你是对的。我可以再问一件事吗。现在,如果它不匹配任何内容,它将返回空对象。我可以将其更改为总值为0的同一对象吗?@Andurit很乐意帮忙!当然,请查看答案中的新编辑。我希望这有帮助。