我需要使用spring数据过滤mongodb中的文档,该数据包含nexted数组。我在mongo shell上使用以下聚合查询,它运行良好。但当我通过springdata聚合操作触发该操作时,我得到的是空响应。mongo查询的工作原理是:
db.searchResource.aggregate({$match:{"_id" : ObjectId("53cf4e3dae92ac6561807f6d")}},{$project:{"rssSearchResponse.journeys":1}},{$unwind : "$rssSearchResponse.journeys"},{$match:{"rssSearchResponse.journeys.stops":0}});
我正在使用但不工作的Spring数据代码:
TypedAggregation<SearchResource> aggregation = Aggregation.newAggregation(SearchResource.class, Aggregation.match(new Criteria("_id").is(new ObjectId(searchId))),
Aggregation.project("rssSearchResponse.journeys"),
Aggregation.unwind("rssSearchResponse.journeys"),
Aggregation.match(new Criteria("rssSearchResponse.journeys.stops").is(0))
);
AggregationResults<SearchResource> result = mongoOperations.aggregate(aggregation, JourneyInformation.class);
我尝试打破这个聚合函数,它能够项目rssSearchResponse.journeys但$unWind后,它返回空结果。
非常感谢您的帮助。
match(where("_id").is(rs.id))
在Mongo聚合中不起作用
。
您必须将rs.id
转换为ObjectId
match(where("_id").is(new ObjectId(rs.id)))
怎么样:
@Test
public void foo() {
mongoTemplate.dropCollection(RssSearchResponse.class);
RssSearch rs = new RssSearch();
rs.id = "123";
rs.rssSearchResponse = new RssSearchResponse(
new Journey[] {new Journey("A", 1),new Journey("B", 0),new Journey("C", 0),new Journey("D", 1)}
);
mongoTemplate.insert(rs);
Aggregation agg = newAggregation(RssSearch.class, //
match(where("_id").is(rs.id)) //
, project("rssSearchResponse.journeys") //
, unwind("journeys") //
, match(where("journeys.stops").is(0)) //
);
AggregationResults<DBObject> result = mongoTemplate.aggregate(agg, RssSearch.class, DBObject.class);
System.out.println(result);
}
static class RssSearch{
String id;
RssSearchResponse rssSearchResponse;
}
static class RssSearchResponse{
Journey[] journeys;
public RssSearchResponse(Journey[] journeys) {
this.journeys = journeys;
}
}
static class Journey{
String name;
int stops;
public Journey(String name, int stops) {
this.name = name;
this.stops = stops;
}
}
这将返回B和C。
我们生成以下聚合命令:
{
"aggregate" : "rssSearch"
, "pipeline" : [
{ "$match" : { "_id" : "123"}}
, { "$project" : { "journeys" : "$rssSearchResponse.journeys"}}
, { "$unwind" : "$journeys"}
, { "$match" : { "journeys.stops" : 0}}
]
}
本文向大家介绍SpringDataMongoDB多文档事务的实现,包括了SpringDataMongoDB多文档事务的实现的使用技巧和注意事项,需要的朋友参考一下 一、安装MongoDB4.0.3(××) 1.1、官方安装文档 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.2、tar.gz包下载地址 h
我有一个工作函数应用,它获取了一个 blob 输入和一个事件中心输出(在 beta 版中工作)。随着最新更改,我的函数不再起作用。我已尝试根据发行说明更新host.json文件,但它没有引用blob触发器: 此外,当Microsoft.NET.Sdk.Functions从1.0.14升级到1.0.19时,无法识别bbloTrigger属性,我的代码将无法编译: 如前所述,这是因为最近的Azure
我使用SpringDataMongo作为ORM来访问我的MongoDb。我需要阅读一个MongoDb集合,其中包含我不管理内容及其有效性的文档。我面临一个问题:文档并非都是有效的,当我使用“findAll”方法时,我只捕获了一个异常。我希望找到所有有效的文档并拒绝无效的文档,而不是这种行为。 例如,我有一个带有原始布尔值的bean,在文档中,该字段被设置为String类型。因此,当我使用findA
我使用的是morphia 0.109,并定义了一个基类,如下所示: 和预期的Morphia实体 null 编辑以添加:我正在使用的保存过程:
我想在JAVA API中编写elasticsearch聚合代码,以查找字段折叠和结果分组。 json聚合代码如下所示,我从elasticsearch文档中获得了这些代码 “dedup\u by\u score”聚合具有称为“top\u hit”聚合的子聚合,并将此聚合用于桶排序。 我想将这个json查询转换为JAVA 这是我已经在JAVA中尝试过的 但是我从Elasticsearch得到了如下错误
我有两个集合。如果集合2中的1号和2号在集合1中指定的一定范围内,我正在尝试将集合2的文档添加到集合1中。集合1中的FYI ObjectId和集合2中的ObjectId指的是两个不同的项目/产品,因此我无法在此id上加入两个集合。 集合1中的示例文档: 集合2中的示例文档: 我想要输出: 我认为使用管道的查找阶段可以工作。我的代码当前如下: 但是运行上面的没有给我输出。我做错了什么吗??