MongoDB $aggregate $push Java Spring 数据中的多个字段
MongoDB $aggregate $push multiple fields in Java Spring Data
我有一个mongo聚合组查询:
db.wizard.aggregate(
{
$group: {
_id: "$title",
versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}}
}
})
我在 Java Spring-Data-MongoDB 中需要这个查询,我当前的解决方案如下所示:
Aggregation agg = Aggregation.newAggregation(
Aggregation.group("title").
push("version").as("versions")
);
问题是我不知道如何向推送方法添加更多字段(版本、作者、添加日期)。
Spring-Data-MongoDB有可能吗?
注意: MongoDB 版本 2.6 - 3.0(兼容 Java 驱动程序)
我扩展了 org.springframework.data.mongodb.core.aggregation.AggregationOperation
class 以实现自定义 toDBObject
方法:
public class GenericAggregationOperation implements AggregationOperation {
private String operator;
private DBObject query;
/**
* Default constructor.
*
* @param operator MongoDB operator ($group, $sort, $project, etc..)
* @param query MongoDB aggregation query step string
*/
public GenericAggregationOperation(String operator, String query) {
this(operator, (DBObject) JSON.parse(query));
}
/**
* Default constructor.
*
* @param operator MongoDB operator ($group, $sort, $project, etc..)
* @param query MongoDB aggregation query step DBObject
*/
public GenericAggregationOperation(String operator, DBObject query) {
this.operator = operator;
this.query = query;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return new BasicDBObject(operator, query);
}
}
在你的情况下,它将是:
List<AggregationOperation> list = new ArrayList<AggregationOperation>();
lista.add(new GenericAggregationOperation("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }"));
TypedAggregation<EpisodeIndexDto> agg = Aggregation.newAggregation(
YourClassTitleVersion.class, list);
mongoOperations.aggregate(agg, YourClassTitleVersion.class,
YourClassTitleVersion.class).getMappedResults();
希望对您有所帮助。
您可以直接将 BasicDbObject 传递到任何聚合管道阶段。
Aggregation agg = newAggregation(
group("title").
push(new BasicDBObject
("version", "$version").append
("author", "$author").append
("dateAdded", "$dateAdded")).as("versions"));
在新版本spring-data-mongodb:2.x.x中AggregationOperation需要returnDocument而不是DBObject,所以更新class将是:
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
public class GenericAggregationOperation implements AggregationOperation {
private String operator;
private DBObject query;
public GenericAggregationOperation(String operator, DBObject query) {
this.operator = operator;
this.query = query;
}
public GenericAggregationOperation(String operator, String query) {
this(operator, BasicDBObject.parse(query));
}
@Override
public Document toDocument(AggregationOperationContext context) {
return new Document(operator, query);
}
}
此外,为了更易于使用,我将添加实用程序界面(java 8+,对于 java 7 或更低版本,您可以将其转换为 class 实用程序) :
import com.mongodb.DBObject;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
public interface GenericAggregationUtils {
static AggregationOperation aggregate(String operation, String query) {
return new GenericAggregationOperation(operation, query);
}
static AggregationOperation aggregate(String operation, DBObject query) {
return new GenericAggregationOperation(operation, query);
}
}
然后我们可以静态导入接口到我们的 class:
import static com.example.mongodb.aggregation.GenericAggregationUtils.*;
并在聚合管道中与其他 spring 数据 AggregationOperation 一起使用,如下所示:
Aggregation aggregation = newAggregation(YourDocCollection.class,
aggregate("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }"),
sort(Sort.Direction.ASC, "title"),
...
);
我有一个mongo聚合组查询:
db.wizard.aggregate(
{
$group: {
_id: "$title",
versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}}
}
})
我在 Java Spring-Data-MongoDB 中需要这个查询,我当前的解决方案如下所示:
Aggregation agg = Aggregation.newAggregation(
Aggregation.group("title").
push("version").as("versions")
);
问题是我不知道如何向推送方法添加更多字段(版本、作者、添加日期)。 Spring-Data-MongoDB有可能吗?
注意: MongoDB 版本 2.6 - 3.0(兼容 Java 驱动程序)
我扩展了 org.springframework.data.mongodb.core.aggregation.AggregationOperation
class 以实现自定义 toDBObject
方法:
public class GenericAggregationOperation implements AggregationOperation {
private String operator;
private DBObject query;
/**
* Default constructor.
*
* @param operator MongoDB operator ($group, $sort, $project, etc..)
* @param query MongoDB aggregation query step string
*/
public GenericAggregationOperation(String operator, String query) {
this(operator, (DBObject) JSON.parse(query));
}
/**
* Default constructor.
*
* @param operator MongoDB operator ($group, $sort, $project, etc..)
* @param query MongoDB aggregation query step DBObject
*/
public GenericAggregationOperation(String operator, DBObject query) {
this.operator = operator;
this.query = query;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return new BasicDBObject(operator, query);
}
}
在你的情况下,它将是:
List<AggregationOperation> list = new ArrayList<AggregationOperation>();
lista.add(new GenericAggregationOperation("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }"));
TypedAggregation<EpisodeIndexDto> agg = Aggregation.newAggregation(
YourClassTitleVersion.class, list);
mongoOperations.aggregate(agg, YourClassTitleVersion.class,
YourClassTitleVersion.class).getMappedResults();
希望对您有所帮助。
您可以直接将 BasicDbObject 传递到任何聚合管道阶段。
Aggregation agg = newAggregation(
group("title").
push(new BasicDBObject
("version", "$version").append
("author", "$author").append
("dateAdded", "$dateAdded")).as("versions"));
在新版本spring-data-mongodb:2.x.x中AggregationOperation需要returnDocument而不是DBObject,所以更新class将是:
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
public class GenericAggregationOperation implements AggregationOperation {
private String operator;
private DBObject query;
public GenericAggregationOperation(String operator, DBObject query) {
this.operator = operator;
this.query = query;
}
public GenericAggregationOperation(String operator, String query) {
this(operator, BasicDBObject.parse(query));
}
@Override
public Document toDocument(AggregationOperationContext context) {
return new Document(operator, query);
}
}
此外,为了更易于使用,我将添加实用程序界面(java 8+,对于 java 7 或更低版本,您可以将其转换为 class 实用程序) :
import com.mongodb.DBObject;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
public interface GenericAggregationUtils {
static AggregationOperation aggregate(String operation, String query) {
return new GenericAggregationOperation(operation, query);
}
static AggregationOperation aggregate(String operation, DBObject query) {
return new GenericAggregationOperation(operation, query);
}
}
然后我们可以静态导入接口到我们的 class:
import static com.example.mongodb.aggregation.GenericAggregationUtils.*;
并在聚合管道中与其他 spring 数据 AggregationOperation 一起使用,如下所示:
Aggregation aggregation = newAggregation(YourDocCollection.class,
aggregate("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }"),
sort(Sort.Direction.ASC, "title"),
...
);