优化集合和项目操作
Optimize set and project operation
我们聚合管道的中间输出如下:
{ "_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" }] }
请求是 print/return 请求(和凭证),其中 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"))));
我们也可以通过以下方式进行:
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"))));
您可以使用这个聚合查询
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")
)
)
);
我们聚合管道的中间输出如下:
{ "_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" }] }
请求是 print/return 请求(和凭证),其中 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"))));
我们也可以通过以下方式进行:
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"))));
您可以使用这个聚合查询
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")
)
)
);