【问题标题】:Optimize set and project operation优化设置和项目操作
【发布时间】:2019-09-09 03:27:56
【问题描述】:

我们的聚合管道的中间输出如下:

{ "_id" : { "$oid" : "..." }, "requestId" : "REQ4", "scrips" : ["3553", "5647", "1234", "0007"], "matched" : [{ "settlement" : "9001" }, { "settlement" : "9002" }], "settled" : [{ "settlement" : "9001" }, { "settlement" : "9003" }] }
{ "_id" : { "$oid" : "..." }, "requestId" : "REQ5", "scrips" : ["3554", "3456"], "matched" : [{ "settlement" : "9003" }], "settled" : [{ "settlement" : "9001" }, { "settlement" : "9003" }] }

请求是打印/返回请求(和脚本),其中matched 是settled 的精确子集。 预期输出:

{ "requestId" : "REQ5", "scrips" : ["3554", "3456"] }

下面的代码似乎可以实现——有没有更高效简洁的方式来实现呢?

        filters.add(Aggregates.project(
                Projections.fields(
                Projections.include("requestId","scrips"),
                Projections.computed("unmatched", 
                        Document.parse("{ $setDifference: 
                        ['$matched','$settled'] }")))));
        filters.add(Aggregates.match(Document.parse("{unmatched:{$eq:[]}}")));  
        filters.add(Aggregates.project(
                Projections.fields(
                Projections.excludeId(),
                Projections.include("requestId","scrips"))));

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongodb-java


    【解决方案1】:

    我们也可以这样做:

    List<Bson> filters = Arrays.asList(
                    Aggregates.match(
                            Document.parse("{ $expr:{ $eq:[ { $size: { $setDifference:[ '$matched', '$settled' ] } }, 0 ] } }")),
                    Aggregates.project(
                            Projections.fields(Projections.excludeId(), Projections.include("requestId", "scrips"))));
    

    【讨论】:

      【解决方案2】:

      您可以使用此聚合查询

      Arrays.asList(
          Aggregates.project(
              Document.parse(
              `{ matchedIsSubsetOfSettled: { $setIsSubset: [ "$matched", "$settled"] },
                 scrips: 1,
                 requestId: 1}`
              )
          );
          Aggregates.match(
              Document.parse("{ matchedIsSubsetOfSettled: true }")
          ),
          Aggregates.project(
              Projections.fields(
                  Projections.excludeId(),
                  Projections.include("requestId", "scrips")
              )
          )
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2012-12-14
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多