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

如何在spring mongodb中检索数组中的匹配元素?

龙永逸
2023-03-14

我试图检索一个带有特定'_ID'的文档和一个带有另一个特定'_ID'的嵌入文档。

我的文档是一个目录,它包含一个课程数组。

示例数据:

'_id': ObjectId('1111'),
'name': 'example catalog',
...
...
'courses': [
     { 
         '_id': ObjectId('2222'),
         'name': 'my course',
         ...
     },
     {
         ....
     }

在mongod中,我运行这个聚合查询,并得到我想要的结果:

db.getCollection('catalogs').aggregate(
{ $match: { '_id': ObjectId('58e8da206ca4f710bab6ef74') } },
{ $unwind: '$courses' },
{ $match: { 'courses._id': ObjectId('58d65541495c851c1703c57f') } })

正如我前面提到的,我已经得到了一个目录实例,里面有一个课程实例。

    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.match(Criteria.where(Catalog.ID_FIELD).is(catalogId)),
            Aggregation.unwind(Catalog.COURSES_FIELD, true),
            Aggregation.match(Criteria.where(Catalog.COURSES_FIELD + '.' + Course.ID_FIELD).is(embeddedCourseId))
    );
    AggregationResults<Catalog> results = mongoTemplate.aggregate(aggregation,
            Catalog.class, Catalog.class);

    List<Catalog> catalog  = results.getMappedResults();

共有1个答案

长孙鸿
2023-03-14

您可以尝试以下选项。关键是在映射响应时保留结构。

常规查询:

使用$位置投影

Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId("58e8da206ca4f710bab6ef74")).and("courses.id").is(new ObjectId("58d65541495c851c1703c57f")));
query.fields().include("name").position("courses", 1);
List<Course> courses = mongoTemplate.find(query, Course.class);
Query query = new Query();
query.addCriteria(Criteria.where("id").is(new ObjectId("58e8da206ca4f710bab6ef74")));
query.fields().include("name").elemMatch("courses", Criteria.where("_id").is(new ObjectId("58d65541495c851c1703c57f") ) );
List<Course> Course = mongoTemplate.find(query, Course.class);
AggregationOperation addFields = new AggregationOperation() {
    @Override
    public DBObject toDBObject(AggregationOperationContext aggregationOperationContext) {
        DBObject dbObject =
                new BasicDBObject("courses",
                        new BasicDBObject("$filter",
                                new BasicDBObject("input", "$$courses").
                                        append("as", "course").
                                        append("cond",
                                            new BasicDBObject("$eq", Arrays.<Object>asList("$$course._id", new ObjectId("58d65541495c851c1703c57f"))))));
        return new BasicDBObject("$addFields", dbObject);
    }
};

Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.match(Criteria.where("_id").is(new ObjectId("58e8da206ca4f710bab6ef74"))),
            addFields
 );
Aggregation aggregation = newAggregation(
     Aggregation.match(Criteria.where("id").is(new ObjectId("58e8da206ca4f710bab6ef74"))),
     Aggregation.project("name")
                 .and(ArrayOperators.Filter.filter("courses").as("course")                          
                 .by(ComparisonOperators.Eq.valueOf("course._id").equalToValue(new ObjectId("58d65541495c851c1703c57f")))
                    ).as("courses")
 );

Mongo版本<=2.6

您必须使用$unwind并添加cours字段,以便spring正确映射它。

 类似资料:
  • 我有这样的元素: 我想检索没有已定义。在这种情况下,元素。 对于这个问题,我得到了相反的结果: 我尝试了和的组合,但是我没有找到合适的解决方案。

  • 我必须在Elasticsearch中构造一个非常重要的查询(现在看来是这样)。假设我有两个实体,每个实体都有一个数组元素,由字符串组成: 数组元素的映射如下(使用动态模板): 实体的Json表示如下: 然后我有了用户输入:['A','B','C']。 我想要实现的是找到只包含输入中指定元素的实体——预期结果是:[A'、[B']、[A'、[C']、[A'],但不是['A'、[E'](因为用户输入中不

  • 给定两个数组,是否有一种numpy非循环方法来检查数组之间的每个第i个索引是否匹配,即如果a[i]==b[i],是否检查每个i? 我想这已经被问过了,但是我找不到我要找的东西,如果是的话,我很抱歉。

  • 我希望通过ContainerRequestFilter中的ExtendedUriInfo检索matchedResources/matchedResults,以便检查路径是否应该受到保护。是否有一种方法可以创建一个在ExtendedUriInfo填充之后,但在调用匹配的资源类和方法之前调用的筛选器?

  • Java中用于检索未排序整数数组中元素的索引的内部数据查询是什么。 不使用任何集合类型进行检索的过程是什么?

  • 我尝试将一个字符串作为输入(大约5-7个字符),遍历每个字符并检查它是否与数组中的字符匹配。例如: 上述观点显然是错误的。然而,我希望它能说明我正在努力做什么。例如,如果字符串是“H3llo”,我想检查字符串中的每个字符,看看它是否与数组中的任何项匹配。如果是这样,我希望将索引存储为int。 这可能不是一种有效的方法,但这是我目前学习水平所能想到的唯一方法。