【问题标题】:MongoDB Spring - Get a value dynamicallyMongoDB Spring - 动态获取值
【发布时间】:2019-12-07 14:05:05
【问题描述】:

我有以下文档,每个文档都在不同的集合中

资产

{
  "_id": "1234",
  "name": "Needle",
  "initialStock": 20
},

{
  "_id": "12345",
  "name": "Serum",
  "initialStock": 5
}

保留

{
  "_id: "12345,
  "from" : ISODate("2019-07-30T07:09:00.000Z"),
  "to" : ISODate("2019-08-30T11:00:00.000Z"),
  "assets": [
      {
     "_id": "1234",
     "assignedStock": 10
      },
     "_id": "12345",
     "assignedStock": 1
      }
    ]
}

如何在两个给定日期之间减去 assignedStockinitialStock?例如“我想知道该资产在两个日期(从开始到结束)之间的可用库存”。

如何在 Spring 上做到这一点? (普通的 Mongo 也会给我一个线索)。

我当前的代码如下,但我只是在资产处得到一个空数组:

LookupOperation lookupOperation = LookupOperation.newLookup()
       .from("assets")
       .localField("assets._id")
       .foreignField("_id")
       .as("assets");

Criteria criteria = Criteria.where("from")
       .gte(from)
       .and("to")
       .lte(to)
       .and("assets")
       .not().size(0)
       .elemMatch(
            Criteria.where("_id")
               .is(idAsset)
       );

Aggregation aggregation = Aggregation.newAggregation(match(criteria), lookupOperation);
List<Document> results =
          this.mongoTemplate.aggregate(aggregation, "reserved", Document.class).getMappedResults();

【问题讨论】:

    标签: spring mongodb spring-boot lookup aggregation


    【解决方案1】:

    这很棘手,即使我是 MongoDB 新手,也觉得这个查询很有挑战性。但是,我设法编写了一个查询,该查询返回您所需的输出。我已经使用 mongo playgroud 来模拟您在问题中指定的场景。

    db.reserves.aggregate([
      {
        $unwind: {
          path: "$assets"
        }
      },
      {
        $group: {
          _id: "$assets._id",
          sumAssigned: {
            $sum: "$assets.assignedStock"
          },
          
        }
      },
      {
        $lookup: {
          from: "assets",
          localField: "_id",
          foreignField: "_id",
          as: "asset_lookup"
        }
      },
      {
        $project: {
          sumAssigned: 1,
          initialStock: {
            $sum: "$asset_lookup.initialStock"
          },
          availableStock: {
            $subtract: [
              "$sumAssigned",
              {
                $sum: "$asset_lookup.initialStock"
              }
            ]
          }
        }
      }
    ])

    https://mongoplayground.net/p/h5eMWIE5q4p // 新解决方案

    https://mongoplayground.net/p/r1bcoUjD3eG // 旧解决方案

    我使用了带有展开、查找和项目操作符的聚合管道。希望对你有帮助。

    【讨论】:

    • 不应该有一个聚合来汇总所有使用资产的储备文件中的所有assignedStock?
    • 如果满足您的要求,您可以在聚合中使用 $sum。除非你想用一些例子来解释你的问题。
    • 是的,我的例子是我可以拥有多个储备,例如两个储备可以拥有相同的资产和不同的分配库存。例如,储备 1 分配了 1 个单位,分配了 id 为 12345 的资产,储备 2 分配了 3 个单位分配了 id 为 12345 的资产。所以现在我需要知道分配的总单位总和减去结果的结果库存将是 20 - 4
    • @Wrong 我已经修改了我的答案,请检查
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2010-12-13
    • 2016-09-22
    相关资源
    最近更新 更多