2017-10-01 1 views
0

J'ai une collection MongoDB qui contient 6 champs document unique, par exemple:

{ 
    "_id" : ObjectId("59d0f2382043f72a443e6ec0"), 
    "TranDate" : "2017-07-25T18:01:12+08:00", 
    "TranCode" : "ActFLA_A01_01_", 
    "TranValue" : "812.34", 
    "Seq" : "71", 
    "Configuration" : "10" 
}, 
{ 
    "_id" : ObjectId("59d0f2332043f72a443e1397"), 
    "TranDate" : "2017-07-25T18:01:12+08:00", 
    "TranCode" : "ActFLA_A01_01_", 
    "TranValue" : "87.34", 
    "Seq" : "71", 
    "Configuration" : "10" 
}, 
{ 
    "_id" : ObjectId("59d0f2332043f72a443e1397"), 
    "TranDate" : "2017-07-25T18:01:12+08:00", 
    "TranCode" : "ActFLA_A01_01_", 
    "TranValue" : "828.34", 
    "Seq" : "71", 
    "Configuration" : "10" 
}, 
{ 
     "_id" : ObjectId("59d0f2342043f72a443e16be"), 
     "TranDate" : "2017-07-25T00:45:02+08:00", 
     "TranCode" : "ActFLA_A01_01_", 
     "TranValue" : "0.00", 
     "Seq" : "2", 
     "Configuration" : "0" 
} 

Voici mon code pour la requête:

Pattern regex = Pattern.compile("^2017-07-25"); 
Pattern regex2 = Pattern.compile("^ActFLA_A"); 
Pattern regex3 = Pattern.compile("^10"); 
DBObject clause1 = new BasicDBObject("TranDate", regex); 
DBObject clause2 = new BasicDBObject("TranCode", regex2); 
DBObject clause3 = new BasicDBObject("Configuration", regex3); 
BasicDBList and = new BasicDBList(); 
and.add(clause1); 
and.add(clause2); 
and.add(clause3); 
DBObject query = new BasicDBObject("$and", and); 

Je suis obtenir un seul document mais j'attends 3 Documents qui contiennent (Champs) TranDate, TranCode, TranSeq et Configuration avec la même valeur sauf TranValue.

+0

Je ne sauverait pas les dates sous forme de chaîne. Cela rend le filtrage de base de données plus difficile que nécessaire. Quoi qu'il en soit votre code est défectueux car les clauses ne sont jamais ajoutées à 'BasicDBList and'. Et vous devez ajouter le code que vous utilisez pour récupérer les correspondances. Peut être le problème est là. – JMax

Répondre

1

La question implique que vous êtes intéressé à retourner les (trois) documents qui remplissent toutes les conditions suivantes:

  • TranDate commence par 2017-07-25
  • TranCode commence par ActFLA_A
  • Configuration commence par 10

Ce qui suit code répondre à cette exigence:

@Test 
public void aQuery() { 
    MongoClient mongoClient = new MongoClientFactory().create(); 

    MongoCollection<Document> collection = mongoClient.getDatabase("stackoverflow").getCollection("ors"); 

    Pattern regex = Pattern.compile("^2017-07-25"); 
    Pattern regex2 = Pattern.compile("^ActFLA_A"); 
    Pattern regex3 = Pattern.compile("^10"); 

    Bson clause1 = Filters.regex("TranDate", regex); 
    Bson clause2 = Filters.regex("TranCode", regex2); 
    Bson clause3 = Filters.regex("Configuration", regex3); 

    Bson query = Filters.and(clause1, clause2, clause3); 

    Assert.assertEquals(3, collection.count(query)); 

    // let's have a look at the matched docs ... 
    FindIterable<Document> documents = collection.find(query); 
    for (Document document : documents) { 
     logger.info(document.toJson()); 
    } 
} 

Compte tenu des exemples de documents inclus dans l'OP, le test ci-dessus enregistre les éléments suivants:

2017-10-01 17:31:59 [main] INFO c.s.mongo.MongoClientTest - { "_id" : { "$oid" : "59d0f2382043f72a443e6ec0" }, "TranDate" : "2017-07-25T18:01:12+08:00", "TranCode" : "ActFLA_A01_01_", "TranValue" : "812.34", "Seq" : "71", "Configuration" : "10" } 
2017-10-01 17:31:59 [main] INFO c.s.mongo.MongoClientTest - { "_id" : { "$oid" : "59d0f2332043f72a443e1397" }, "TranDate" : "2017-07-25T18:01:12+08:00", "TranCode" : "ActFLA_A01_01_", "TranValue" : "87.34", "Seq" : "71", "Configuration" : "10" } 
2017-10-01 17:31:59 [main] INFO c.s.mongo.MongoClientTest - { "_id" : { "$oid" : "59d11663c26584cd8b7a0ee8" }, "TranDate" : "2017-07-25T18:01:12+08:00", "TranCode" : "ActFLA_A01_01_", "TranValue" : "828.34", "Seq" : "71", "Configuration" : "10" }