Spring mongodb 如果文档中的列表中的单个字段匹配,则查找文档

Spring mongodb Find document if a single field matches in a list within a document

我有一些数据存储为

{
    "_id" : ObjectId("abc"),
    "_class" : "com.xxx.Team",
    "name" : "Team 1",
    "members" : [ 
        {"userId" : 1, "email" : "a@x.com" },
        {"userId" : 2, "email" : "b@x.com" },
    ]
}
{
    "_id" : ObjectId("xyz"),
    "_class" : "com.xxx.Team",
    "name" : "Team 2",
    "members" : [ 
        {"userId" : 2, "email" : "b@x.com" },
        {"userId" : 3, "email" : "c@x.com" }
    ]
}

我有 2 个 POJO 类 Team(映射到整个文档),TeamMember(映射到文档中的 members)。

现在我想查找特定用户属于哪个团队。例如,如果我搜索 a@x.com,它应该 return 为 Team 1 我的文档。类似地搜索 b@x.com 应该 return 它们在两个文档中都一样。

由于我是 spring 的新手,无法找到解决方法。

注意:我正在使用 MongoTemplate

像这样就可以了

 final QueryBuilder queryBuilder = QueryBuilder.start();
 //queryBuilder.and("members.email").is("a@x.com") This will work as well. try it out.
  queryBuilder.and("members.email").in(Arrays.asList("a@x.com"))

 final BasicDBObject projection = new BasicDBObject();
        projection.put("fieldRequired", 1);


 try (final DBCursor cursor = mongoTemplate.getCollection(collectionName).find(queryBuilder.get(), projection)
            .batchSize(this.readBatchSize)) {
            while (cursor.hasNext()) {
                DBObject next = cursor.next();
                ........
                // read the fields using next.get("field")
                .........
            }
        }

批量大小和投影不是强制性的。如果您不想获取整个文档,请使用投影。您可以指定要在结果中提取文档中的哪个字段。

您可以将以下代码与 MongoTemplate

一起使用
Query findQuery = new Query();
Criteria findCriteria =  Criteria.where("members.email").is("b@x.com");
findQuery.addCriteria(findCriteria);
List<Team> teams = mongoTemplate.find(findQuery, Team.class);