2017-05-08 1 views
1

J'ai des données stockées sous formeSpring mongodb Trouver document si un seul champ correspond à une liste dans un document

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

J'ai 2 classes POJO Team (mis en correspondance document entier), TeamMember (cartographiés à members intérieur un document).

Maintenant, je veux trouver à quelle équipe appartient un utilisateur spécifique. Par exemple, si je cherche [email protected] il devrait me renvoyer le document pour Team 1. De même, la recherche de [email protected] devrait retourner les deux comme étant dans les deux documents.

Comme je suis très nouveau au printemps, pas en mesure de trouver comment résoudre ce problème.

Note: J'utilise MongoTemplate

+0

vous utilisez référentiel de données de printemps ou MongoTemplate pour interroger votre base de données? Mettez à jour votre question avec vos classes pojo (Team et TeamMember) – pvpkiran

+0

@pvpkiran J'utilise MongoTemplate – BiJ

Répondre

0

Vous pouvez utiliser le code ci-dessous avec le MongoTemplate

Query findQuery = new Query(); 
Criteria findCriteria = Criteria.where("members.email").is("[email protected]"); 
findQuery.addCriteria(findCriteria); 
List<Team> teams = mongoTemplate.find(findQuery, Team.class); 
1

somthing comme celui-ci fera

final QueryBuilder queryBuilder = QueryBuilder.start(); 
//queryBuilder.and("members.email").is("[email protected]") This will work as well. try it out. 
    queryBuilder.and("members.email").in(Arrays.asList("[email protected]")) 

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") 
       ......... 
      } 
     } 

batchsize et projection est pas obligatoire. Utilisez la projection si vous ne voulez pas récupérer le document entier. Vous pouvez spécifier le champ du document que vous voulez récupérer dans le résultat.