我如何使用 Node.js 和 Mongoose 计算总正价、总负价和总和

2024-02-23

我已经编写了获取所有用户记录的查询

exports.index = function(req, res) {
    Userdata.find(function(err, userdatas) {
        if (err) {
            return handleError(res, err);
        }

        console.log(userdatas);

    });

};

控制台我收到以下文件

{
    "_id" : ObjectId("584bc9ba420a6b189c510af6"),
    "user_id" : 1,
    "price" : 2000.0,
    "type" : "credit",

},
{
    "_id" : ObjectId("584bc9ba420a6b189c510af7"),
    "user_id" : 1,
    "price" : -1000.0,
    "type" : "credit",

},
{
    "_id" : ObjectId("584bc9ba420a6b189c510af8"),
    "user_id" : 2,
    "price" : 1000.0,
    "type" : "credit",

}

现在我想计算总正数、总负数价格和总和(总正数-总负数)

一旦计算出,我需要在摘要集合中插入/更新

如果用户 ID 已经出现在摘要集合中,那么我们需要更新特定的用户文档

如果用户 ID 不存在,我们需要为该用户创建新文档

这里摘要集合已经存在 user_id = 1 ,因此我们需要更新此文档,并且 user_id = 2 不存在于摘要集合中,因此我们需要创建 .

    {
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": 1,
        "Totalpositiveprice": 3000.0,
        "Totalnegativeprice": 0,
        "Balanceprice": 3000.0
    },
{
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": 3,
        "Totalpositiveprice": 200.0,
        "Totalnegativeprice": -190,
        "Balanceprice": 10.0
    }

我的预期结果:

    {
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": "1",
        "Totalpositiveprice": 5000.0,
        "Totalnegativeprice": -1000.0,
        "Balanceprice": 4000.0
    },
    {

        "user_id": "2",
        "Totalpositiveprice": 1000.0,
        "Totalnegativeprice": 0,
        "Balanceprice": 1000.0
    },
   {
        "_id" : ObjectId("584bc9ba420a6b189c510af9"),
        "user_id": 3,
        "Totalpositiveprice": 200.0,
        "Totalnegativeprice": -190,
        "Balanceprice": 10.0
    }

一旦计算出,我需要在摘要集合中插入/更新


考虑到预期结果是数字,并且值来自summary集合是数字(否则你需要将它们设为数字)这里是计算结果的聚合:

db.getCollection('userpricing').aggregate([
    {$group: {
        _id:"$user_id", 
        user_id: {$first: "$user_id"}, 
        Totalpositiveprice:{$sum:{$cond:[{ '$gt': ['$price', 0]}, "$price", 0]}}, 
        Totalnegativeprice:{$sum:{$cond:[{ '$lt': ['$price', 0]}, "$price", 0]}},
        Balanceprice:{"$sum":"$price"}}
     },
    {
      $lookup:
        {
          from: "summary",
          localField: "user_id",
          foreignField: "user_id",
          as: "user_id2"
        }
   },
   {$project: {
    _id:0, 
    user_id:1, 
    Totalpositiveprice: {$sum: ["$Totalpositiveprice", {$sum: "$user_id2.Totalpositiveprice"}] },
    Totalnegativeprice: {$sum: ["$Totalnegativeprice", {$sum: "$user_id2.Totalnegativeprice"}] },
    Balanceprice: {$sum: ["$Balanceprice", {$sum: "$user_id2.Balanceprice"}] },
}},

     {$out: "summary"}
]).pretty()

Result:

db.summary.find().pretty()

{
    "_id" : ObjectId("584fde2906c7385883be0d15"),
    "user_id" : 2,
    "Totalpositiveprice" : 10000,
    "Totalnegativeprice" : 0,
    "Balanceprice" : 10000
}
{
    "_id" : ObjectId("584fde2906c7385883be0d16"),
    "user_id" : 1,
    "Totalpositiveprice" : 23000,
    "Totalnegativeprice" : -10000,
    "Balanceprice" : 13000
}

如果需要的话,稍后您需要将它们转换为字符串。

Note: 结果它用新的计算(和更新)值覆盖摘要集合。最好先测试一下你的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何使用 Node.js 和 Mongoose 计算总正价、总负价和总和 的相关文章

随机推荐

  • 如何使用 Selenium webdriver 单击第二个提交按钮?

    Example 对于第一个按钮
  • 在主 Activity 中嵌入外部 Intent

    我见过许多使用 ActivityGroup 在单个视图中嵌入多个 Activites 的示例 在每种情况下 正在加载的活动都是当前应用程序的内部活动 此外 它们似乎都占据了整个视野 我想使用特定 MIME 类型的 Intent 启动外部活动
  • 将任务添加到 Build.scala

    该文件http www scala sbt org 0 13 0 docs Detailed Topics Tasks html http www scala sbt org 0 13 0 docs Detailed Topics Task
  • 查找名称包含字符串的所有文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找一个命令 该命令将从当前目录返回文件名中包含字符串的文件 我见过locate and find可以查找以某些内容开头的文件的命
  • NuGet 包管理器:“AutoMapper”已具有为“Microsoft.CSharp”定义的依赖项

    我尝试在 Visual Studio Premium 2012 上使用 NuGet 将 AutoMapper 添加为项目的依赖项 但失败 它说 手术失败 AutoMapper 已经定义了一个依赖项 微软 CSharp 我可以添加其他依赖项
  • Flutter 重定向到 initState 上的页面

    我有一个应用程序 您需要登录才能继续 例如使用 Google 我想在需要身份验证时重定向用户 但是当我运行Navigator of context pushNamed myroute 我收到以下错误 EXCEPTION CAUGHT BY
  • 如何从 firebase 中删除条目

    我正在探索 Firebase 的功能 我在如何使用 java 代码从 Firebase 中删除节点或条目时遇到了问题 我搜索了他们的API 网络版本确实提供了remove 函数 但java没有 有一个removeValue 方法上的Fire
  • FluentNHibernate Component.ColumnPrefix 未应用

    我最近升级了FluentNHibernate from v1 1 0 685 to v1 2 0 712 最新 对于NHibernate 2 1 我的问题似乎是使用的类Component ColumnPrefix 映射 例如 public
  • ret2libc 攻击不会生成 shell

    我执行了 ret2libc 一切正常 但 shell 没有生成 源代码是 include
  • JHipster 的正确 Eclipse 设置是什么?

    我在第一次尝试在 STS Eclipse 中编译 jhipster 项目时收到此错误 The type org springframework core NestedRuntimeException cannot be resolved I
  • 如何向 PyPi 分发类型提示?

    我致力于将 Python 3 5 类型提示添加到响应库中 但是当我测试进行分发时 sdist or bdist wheel 它没有安装我的 pyi文件 我可以看到它是发行版的一部分 但仅此而已 您可以在此处查看我在存储库中获得的内容 htt
  • 包含 jQuery $.post() 函数的函数的返回值

    我知道 AJAX 是异步的 等等 但我有以下代码 function doesUsernameExist element Check via AJAX POST if username already exists in the databa
  • 合并 2 个排序列表

    我被要求针对以下问题提出尽可能多的解决方案 编写一个函数 它接受两个数字列表 均假设为 按升序排列 并将它们合并到一个列表中 也在 升序 我的第一个解决方案是append list1 onto list2然后重新sort 然后我发现一个内置
  • Android Mono 中的自定义应用程序子类

    我试图创建一个 Android App Application 的子类来覆盖 OnCreate 但我无法让它工作 这是我的代码 namespace MonoAndroidAcra Application Debuggable true La
  • 如何访问 tcp 标头详细信息?

    就像我创建了套接字并将该套接字绑定到客户端一样 我能够连接两侧并能够发送任意数量的数据 它基本上是 TCP 套接字 我的问题是我想访问 TCP 标头详细信息以检查和设置某种操作的参数 但我无法做到这一点 我正在用户空间中工作 从套接字级别我
  • 如何使用 Mercurial“恢复”未更改的文件?

    我在我的计算机上安装了 Windows7 我必须更改所有权限 取得所有权 这显然 触及 了我的所有文件 现在所有内容似乎都被 修改 当我执行 hg status 时 但只有一些文件有实际更改 是否有一个命令我可以运行 以便我可以 提交 或
  • 如何在 wicket 1.5 中的页面加载时打开模式窗口

    我使用 wicket 1 4 x 一段时间 在这里找到的解决方案效果很好 如何在页面加载时打开模态对话框 https stackoverflow com questions 4765790 how to open modaldialog o
  • 如何在 VBA 中替换范围/选择范围内的 Microsoft Word 字符样式?

    我正在开发一个带有宏的 Word 2007 模板 该宏会将字符样式应用于所选文本 查找 替换功能似乎是一个很好的起点 但我认为我发现了一个错误 限制 导致宏无法按预期工作 这是我的 vba 代码 Sub restyleSelection D
  • 如何检查按钮形状是否启用? [复制]

    这个问题在这里已经有答案了 如何使用 UIAccessibility 检查 iOS 设备辅助功能设置中的 按钮形状 选项是否已启用 我想在定制按钮上支持 按钮样式 我将代码转换为this https stackoverflow com a
  • 我如何使用 Node.js 和 Mongoose 计算总正价、总负价和总和

    我已经编写了获取所有用户记录的查询 exports index function req res Userdata find function err userdatas if err return handleError res err