有人可以帮我弄这个吗
Can someone help me with this
我实际上需要在 mongoDb 中使用聚合。我已经使用以下查询来加入两个集合,然后通过一些过滤器提取答案。查询在 mongodb 终端中运行良好。
但是我需要在 Spring boot 中使用 aggreagte 函数在 springboot 中使用这个查询。我查看了以下文档,非常有用。但是由于查询非常大。这就是为什么我无法以正确的方式编写它。
https://www.baeldung.com/spring-data-mongodb-projections-aggregations
db.coll1.aggregate([
{
"$unionWith": {"coll": "coll2"}
},
{
"$group": {
"_id": {
"Id": "Id",
"Name": {
"$arrayElemAt": [
{
$split: [
"FullName",
"T",
]
},
1
]
},
"StreetName": {
"$arrayElemAt": [
{
$split: [
"Address",
"T",
]
},
1
]
}
},
"count": {
"$sum": 1
}
}
},
{
"$match": {
"$expr": {
"$gt": [
"$count",
1
]
}
}
}])
你能帮我使用聚合函数并转换这个查询,这样我就可以在 springboot 中使用它吗?
看起来像是在尝试进行计数 (*),按 trunc(gapStartTimeStamp)、trunc(gapEndTimeStamp) 分组,其中计数 > 1
如果是这样的话:
您的查询略有不同,已使用 spring-data-mongodb 3.1.8
进行测试
UnionWithOperation unionWith = UnionWithOperation.unionWith("coll2");
ProjectionOperation convertStartDateOp = Aggregation.project("stationId", "gapStartTimeStamp", "gapEndTimeStamp")
.and(StringOperators.Substr.valueOf("gapStartTimeStamp").substring(0, 10))
.as("gapStartDate")
.and(StringOperators.Substr.valueOf("gapEndTimeStamp").substring(0, 10))
.as("gapEndDate");
GroupOperation countOp = Aggregation.group("stationId", "gapStartDate", "gapEndDate").count().as("count");
MatchOperation matchOp = Aggregation.match(Criteria.where("count").gt(1));
AggregationResults<Document> aggregate = mongoOps.aggregate(
Aggregation.newAggregation(
unionWith,convertStartDateOp,countOp, matchOp
),
YourColl1.class, Document.class);
List<Document> mappedResults = aggregate.getMappedResults();
生成此查询:
db.coll1.aggregate(
[
{"$unionWith": {"coll": "coll2"}},
{"$project":
{
"stationId": 1,
"gapStartTimeStamp": 1,
"gapEndTimeStamp": 1,
"gapStartDate": {"$substr": ["$gapStartTimeStamp", 0, 10]},
"gapEndDate": {"$substr": ["$gapEndTimeStamp", 0, 10]}
}
},
{"$group": {
"_id": {
"stationId": "$stationId",
"gapStartDate": "$gapStartDate",
"gapEndDate": "$gapEndDate"
},
"count": {"$sum": 1}
}
},
{"$match": {"count": {"$gt": 1}}}
]
);
我实际上需要在 mongoDb 中使用聚合。我已经使用以下查询来加入两个集合,然后通过一些过滤器提取答案。查询在 mongodb 终端中运行良好。
但是我需要在 Spring boot 中使用 aggreagte 函数在 springboot 中使用这个查询。我查看了以下文档,非常有用。但是由于查询非常大。这就是为什么我无法以正确的方式编写它。
https://www.baeldung.com/spring-data-mongodb-projections-aggregations
db.coll1.aggregate([
{
"$unionWith": {"coll": "coll2"}
},
{
"$group": {
"_id": {
"Id": "Id",
"Name": {
"$arrayElemAt": [
{
$split: [
"FullName",
"T",
]
},
1
]
},
"StreetName": {
"$arrayElemAt": [
{
$split: [
"Address",
"T",
]
},
1
]
}
},
"count": {
"$sum": 1
}
}
},
{
"$match": {
"$expr": {
"$gt": [
"$count",
1
]
}
}
}])
你能帮我使用聚合函数并转换这个查询,这样我就可以在 springboot 中使用它吗?
看起来像是在尝试进行计数 (*),按 trunc(gapStartTimeStamp)、trunc(gapEndTimeStamp) 分组,其中计数 > 1
如果是这样的话: 您的查询略有不同,已使用 spring-data-mongodb 3.1.8
进行测试
UnionWithOperation unionWith = UnionWithOperation.unionWith("coll2");
ProjectionOperation convertStartDateOp = Aggregation.project("stationId", "gapStartTimeStamp", "gapEndTimeStamp")
.and(StringOperators.Substr.valueOf("gapStartTimeStamp").substring(0, 10))
.as("gapStartDate")
.and(StringOperators.Substr.valueOf("gapEndTimeStamp").substring(0, 10))
.as("gapEndDate");
GroupOperation countOp = Aggregation.group("stationId", "gapStartDate", "gapEndDate").count().as("count");
MatchOperation matchOp = Aggregation.match(Criteria.where("count").gt(1));
AggregationResults<Document> aggregate = mongoOps.aggregate(
Aggregation.newAggregation(
unionWith,convertStartDateOp,countOp, matchOp
),
YourColl1.class, Document.class);
List<Document> mappedResults = aggregate.getMappedResults();
生成此查询:
db.coll1.aggregate(
[
{"$unionWith": {"coll": "coll2"}},
{"$project":
{
"stationId": 1,
"gapStartTimeStamp": 1,
"gapEndTimeStamp": 1,
"gapStartDate": {"$substr": ["$gapStartTimeStamp", 0, 10]},
"gapEndDate": {"$substr": ["$gapEndTimeStamp", 0, 10]}
}
},
{"$group": {
"_id": {
"stationId": "$stationId",
"gapStartDate": "$gapStartDate",
"gapEndDate": "$gapEndDate"
},
"count": {"$sum": 1}
}
},
{"$match": {"count": {"$gt": 1}}}
]
);