我想使用mongodb聚合匹配操作,通过字符串中多个嵌套对象的对象Id筛选mongodb集合。但是,在匹配操作中,spring data mongodb不会将字符串值转换为对象Id。
当Spring data mongodb将字符串值转换为oid时,我能够通过字符串值中的多个文档Id(主键,而不是嵌套对象的对象Id)过滤文档,没有任何问题:
{ "_id" : { "$in" : [{ "$oid" : "61a31853d268434139e7fc11"}, { "$oid" : "61a31853d268434139e7fc12"}]}
我想要达到的目标如下:
db.getCollection('products').aggregate(
[
{ "$match" : { "$and" : [{ "type._id" : { "$in" : [
ObjectId("618b99a3b4c24465b074b246"),
ObjectId("60afc0920dab8b6d3ac26355")
] }}]}}
])
但我总是得到以下信息:
db.getCollection('products').aggregate(
[
{ "$match" : { "$and" : [{ "type._id" : { "$in" : [
[{ "$oid" : "618b99a3b4c24465b074b246"}, { "$oid" : "60afc0920dab8b6d3ac26355"}]
]}}]}}
])
Spring data mongodb为$in json中的OID生成了二维数组
我的Mongodb实体:
@Document(collection = "products")
public class Product {
@Id
private String id;
@NotNull
private ProductType type;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Type getType() {
return type;
}
public void setType(ProductType type) {
this.type = type;
}
}
@Document(collection = "product_types")
public class ProductType {
@Id
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
我的java代码执行聚合:
List<String> typeIds = Arrays.asList("618b99a3b4c24465b074b246", "60ad10ffc723877d8a977149");
List<AggregationOperation> aggregateOperations = new ArrayList<>();
Criteria criteria = Criteria.where("type._id").in(typeIds.stream().map(t -> new ObjectId(t)).collect(Collectors.toList()));
aggregateOperations.add(Aggregation.match(criteria));
Aggregation aggregation = Aggregation.newAggregation(aggregateOperations);
mongoTemplate.aggregate(aggregation, "products", ProductListDTO.class);
mongoDB收集数据如下:
{
"_id" : ObjectId("61a31853d268434139e7fc11"),
"type" : {
"_id" : ObjectId("618b99a3b4c24465b074b246")
}
}
它按预期工作。当您记录聚合管道时,它写为{$oid:“hex”}(日期也是这样)。
内部驱动程序按ObjectId(...)
搜索:
//WHEN
Criteria criteria = Criteria.where("type._id")
.in(typeIds.stream().map(ObjectId::new).collect(Collectors.toList()))
.and("date").is(new Date(currDate));
//Searches:
Document{{$match=Document{{type._id=Document{{$in=[618b99a3b4c24465b074b246]}}, date=Tue Dec 14 01:53:09 CET 2021}}}}
//LOG:
{
"aggregate": "__collection__",
"pipeline": [
{
"$match": {
"type._id": {
"$in": [
{
"$oid": "618b99a3b4c24465b074b246"
}
]
},
"date": {
"$date": "2021-12-14T00:53:09.817Z"
}
}
}
]
}
我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。 属性在映射中定义为嵌套对象,如下所示: 我试图以以下形式执行一个复杂的查询: 这是elasticsearch 2.x。我做错了什么?
设备类型。Java语言 elemetry.java枚举类 我想获取所有DeviceType Id,其DeviceTeletry名称以“System”(字符串)开头。 我做了这样的事情:- 有谁能告诉我如何从中获取DeviceType Id吗?
我试图在嵌套筛选器聚合中使用嵌套查询筛选器。当我这样做时,聚合返回时没有任何项。如果我将查询更改为简单的旧match_all筛选器,我确实会在bucket中获得项。 下面是我正在使用的映射的简化版本: 该查询在聚合上使用match_all筛选器:
我正试图找出如何解决这两个问题,我有我的ES 5.6索引。 我需要创建两个单独的脚本过滤器: 1-筛选employee数组大小==3的文档 2-筛选数组第一个元素为“name”==“John”的文档 我试图做一些第一步,但我无法迭代列表。我总是有一个空指针异常错误。
问题内容: 阅读了SCJP Tip Line的作者Corey McGlone在javaranch网站上的文章后,我都感到困惑。从字面上看是Strings,由Kathy Sierra(javaranch的联合创始人)和Bert Bates共同编写的《 SCJP Java 6程序员指南》。 我将尝试引用Corey先生和Kathy Sierra女士对String Literal Pool的引用。 1.根
我希望能够过滤评论,所以只有真正的评论将为每个博客对象显示。我想展示每一个博客,而不仅仅是那些有真实评论的博客。我在网上找到的所有其他解决方案似乎都影响了我的博客对象。有没有一种方法可以过滤掉评论对象而不影响所有博客的查询? 因此,上述示例将在查询之后返回: 该示例仍然显示了没有评论或错误评论的博客。 这可能吗? 我一直在使用这个示例中的嵌套查询:ElasticSearch-Get只匹配嵌套对象与