Mongodb 优化集合和项目操作

Mongodb 优化集合和项目操作,mongodb,mongodb-query,aggregation-framework,mongodb-java,Mongodb,Mongodb Query,Aggregation Framework,Mongodb Java,我们聚合管道的中间输出如下所示: { "_id" : { "$oid" : "..." }, "requestId" : "REQ4", "scrips" : ["3553", "5647", "1234", "0007"], "matched" : [{ "settlement" : "9001" }, { "settlement" : "9002" }], "settled" : [{ "settlement" : "9001" }, { "settlement" : "9003" }] }

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

{ "_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" }] }
任务是打印/返回请求(和凭条),
匹配的
已结算的
的精确子集。 预期产出:

{ "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"))));

我们也可以通过以下方式进行:

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"))));
List filters=Arrays.asList(
A.match(
parse(“{$expr:{$eq:[{$size:{$setDifference:['$matched','$settled']}},0]}”),
A.项目(
Projections.fields(Projections.excludeId(),Projections.include(“requestId”,“scrips”));

我们也可以通过以下方式完成:

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"))));
List filters=Arrays.asList(
A.match(
parse(“{$expr:{$eq:[{$size:{$setDifference:['$matched','$settled']}},0]}”),
A.项目(
Projections.fields(Projections.excludeId(),Projections.include(“requestId”,“scrips”));

您可以使用此聚合查询

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")
        )
    )
);

您可以使用此聚合查询

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")
        )
    )
);