当前位置: 首页 > 知识库问答 >
问题:

Spring data mongodb筛选器字符串集合中的嵌套对象id

荆煌
2023-03-14

我想使用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")
    }
}

共有1个答案

周阳成
2023-03-14

它按预期工作。当您记录聚合管道时,它写为{$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只匹配嵌套对象与