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);
我有一些数据存储为
{
"_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);