2016-05-27 9 views
3

Ich brauche Hilfe bei der Verwendung von elemMatch im Frühjahr Daten, um Daten in Mongodb abzufragen und Ergebnisse von Mongodb abrufen.Wie elemMatch im Frühjahr Daten für verschachtelte Objekte verwenden, um Daten von Mongodb zu erhalten

Ich will Ergebnisse abrufen für einen bestimmten TESTRUN sagen TESTRUN = 1

Ich habe die folgenden Daten in mongodb:

[ { 
"testMethod": "initialization", 
"testCase": "com.harish.test.TestNGRest.OrganisationGetTest", 
"build": 1, 
"ranNumberofTimes": 2, 
"failed": 0, 
"success": 2, 
"testRuns": [ 
    { 
    "testMethod": "initialization", 
    "testCase": "com.harish.test.TestNGRest.OrganisationGetTest", 
    "branchName": "branch_1", 
    "testRun": 1, 
    "success": 1, 
    "fail": 0, 
    "timetorun": 0, 
    "cases": [ 
     { 
     "caseId": 1, 
     "status": "success", 
     "failreason": null, 
     "startDate": "Fri May 27 14:41:22 EDT 2016", 
     "endDate": "Fri May 27 14:41:22 EDT 2016" 
     } 
    ], 
    "startDate": "Fri May 27 14:41:22 EDT 2016", 
    "endDate": "Fri May 27 14:41:22 EDT 2016" 
    }, 
    { 
    "testMethod": "initialization", 
    "testCase": "com.harish.test.TestNGRest.OrganisationGetTest", 
    "branchName": "branch_1", 
    "testRun": 2, 
    "success": 1, 
    "fail": 0, 
    "timetorun": 1, 
    "cases": [ 
     { 
     "caseId": 1, 
     "status": "success", 
     "failreason": null, 
     "startDate": "Fri May 27 14:41:49 EDT 2016", 
     "endDate": "Fri May 27 14:41:49 EDT 2016" 
     } 
    ], 
    "startDate": "Fri May 27 14:41:49 EDT 2016", 
    "endDate": "Fri May 27 14:41:49 EDT 2016" 
    } 
] 

In Mongo Konsole verwendete ich den folgenden Befehl ein und bekam die Ergebnisse:

db.test.find({"testRuns.testRun":1},{"testRuns":{"$elemMatch":{"testRun":1}}}).pretty() 

Ich habe die Ergebnisse für meine Anforderung in Mongo-Konsole.

Die eigentliche Frage kommt hier, ich habe Spring-Daten verwendet, um die Ergebnisse in meinem Java-Code abzurufen.

return mongoTemplate.find(BasicQuery.query(Criteria.where("testRuns.testRun").is(testRun).andOperator(Criteria.where("testRuns").elemMatch(Criteria.where("testRun").is(testRun)))),Test.class, COLLECTION_NAME); 

Allerdings kann ich die Ergebnisse für einen bestimmten Testlauf nicht abrufen. Kann mir bitte jemand helfen, dieses Problem zu lösen?

Vielen Dank.

Antwort

1

Sie brauchen $ elemMatch nicht, wenn Sie "testRuns.testRun" = 1 erhalten möchten. Es gibt keine zweite Bedingung. Bitte beachten Sie die folgende Erklärung im Link zum Mongo-Referenzdokument.

„Da nur die $ elemMatch eine einzige Bedingung gibt, ist die $ elemMatch Ausdruck nicht notwendig, und stattdessen können Sie die folgende Abfrage verwenden:“

db.survey.find(
{ "results.product": "xyz" } 
) 

https://docs.mongodb.com/manual/reference/operator/query/elemMatch/

ich mit der getestet unter Code mit den Daten in der Post angegeben. Es funktioniert gut.

Stellen Sie sicher, dass die Variable testRun als Integer in Java-Code definiert ist. Wenn es einen anderen Datentyp aufweist, gibt die Abfrage kein Ergebnis zurück.

query.addCriteria(Criteria.where("testRuns.testRun").is(testRun)); 
mongoOperations.find(query, Stack.class); 
+0

Hallo @ Notionquest. Tatsächlich habe ich viele no.of Aufzeichnungen die gleiche wie die von mir in meinem Beitrag in einer einzigen Sammlung zur Verfügung gestellt. Ich habe versucht, die Abfrage, die Sie zur Verfügung gestellt und die Abfrage, die ich zur Verfügung gestellt, beide ruft alle Datensätze in der Sammlung und nicht die spezifischen Datensätze, die meine Anforderungen entsprechen. Können Sie mir eine Abfrage stellen, um Datensätze für einen beliebigen TestRun-Wert wie 1 oder 2 oder eine beliebige Zahl abzurufen. – harish

+0

@harish, Nur um es klar zu machen, behält die Abfrage das gesamte Dokument, das testRun = 1 hat (d. H. Selbst wenn eines der Array-Elemente diese Bedingung erfüllt). Wenn Sie weiter filtern möchten, müssen Sie möglicherweise zusätzliche Felder in die Filterbedingung aufnehmen, vorzugsweise eines der Felder der obersten Ebene, wie testMethod, Build usw. – notionquest

+0

Ok @notionquest. Vielen Dank für Ihre Antwort. Ich habe deine Antwort genehmigt :) – harish

Verwandte Themen