【问题标题】:MongoDB query to subtract one record value with anotherMongoDB查询用另一个减去一个记录值
【发布时间】:2025-11-30 06:15:03
【问题描述】:

我正在获取所有记录的 value 字段,并用下一个记录值减去它。 这是我的记录的样子:

{
  "name":"abc",
  "value":10
},
{
  "name":"xyz",
  "value":20
},
{
 "name":"pqr",
 "value":30
}

我已经通过这些查询来实现它,但没有得到想要的输出。

查询:

db.myc.aggregate([{
    $unwind: "$value"
}, {
    $group: {
        _id: "$name",
        value1: {
            $first: "$value"
        },
        value2: {
            $last: "$value"
        },
    }
}, {
    $project: {
        Output: {
            $subtract: ["$value1", 10]
        }
    }
}]);

得到如下输出:

{ "_id" : "abc", "Output" : 0 }
{ "_id" : "xyz", "Output" : 10 }
{ "_id" : "pqr", "Output" : 20 }

我正在寻找的期望输出,第一条记录 应该保持不变,即 10,下一条记录值(20)应该减去第三条记录值(30)。这样所有字段值都将保持 10。(输入数据将始终与下一个数据有 10 的差异)。

谁能告诉我如何实现它???

【问题讨论】:

  • 这不是$first$last 所做的。如果这是您所期望的,您将无法访问上一个或下一个文档。对这种类型的事物使用光标。
  • @NeilLunn 当然,我会试试光标。

标签: node.js database mongodb


【解决方案1】:

输入:

    {
         "_id" : ObjectId("5bf52fe30d11f12257d430bf"),
    "name" : "fff",
   "value" : 50
    },
   {
   "_id" : ObjectId("5bf52fe30d11f12257d430c0"),
    "name" : "gd",
   "value" : 60
   },
  {
  "_id" : ObjectId("5bf52fe30d11f12257d430c1"),
  "name" : "ffagf",
   "value" : 70
   }

使用以下查询获得所需的输出:

注意:最高值最后会存储为0。

  db.myc.find().forEach(
  function(doc){
  var n = db.myc.findOne({_id:{"$gt":doc._id}}); 
  var diff = n.value-doc.value; 
   print(tojson(diff)); 
 });

输出:

10
10
0

参考这个答案:Link

【讨论】: