2016-11-07 4 views
4

Ich habe eine Situation, in der Datensätze in Mongo DB ist wie:Suche mit dynamischen Feldnamen in MongoDB

{ 
"_id" : "xxxx", 
"_class" : "xxxx", 
"orgId" : xxx, 
"targetKeyToOrgIdMap" : { 
    "46784_56139542ecaa34c13ba9e314" : 46784, 
    "47530_562f1bc5fc1c1831d38d1900" : 47530, 
    "700004280_56c18369fc1cde1e2a017afc" : 700004280 


    }, 
} 

Ich habe, um die Datensätze herausfinden, wo untergeordneter Knoten von targetKeyToOrgIdMap einen bestimmten Satz von Werten hat. Das heißt, ich weiß, was der Wert in dem Datensatz in "46784_56139542ecaa34c13ba9e314": 46784 Teil dort sein wird. Und der Feldname ist variabel, seine Kombination aus dem Wert und einer zufälligen Zeichenfolge.

Im obigen Beispiel habe ich 46784, und ich muss alle Datensätze finden, die 46784 in diesem jeweiligen Feld haben.

Gibt es eine Möglichkeit, ich kann einige Regex oder etwas ähnliches oder mit einem anderen Mittel, wo ich die Datensätze, die den Wert, den ich brauche in den Kindknoten des Feldes targetKeyToOrgIdMap haben würde feuern.

Vielen Dank im Voraus

+0

Nicht möglich mit der 'find()' Methode, vielleicht mit 'mapReduce'. Möglicherweise müssen Sie in Erwägung ziehen, Ihr Schema zu ändern, um 'targetKeyToOrgIdMap' zu einem Array von Objekten mit Schlüssel- und Werteigenschaften zu machen, die einfacher abzufragen sind:' "targetKeyToOrgIdMap": [{"id": "46784_56139542ecaa34c13ba9e314", "value": 46784} , { "id": "47530_562f1bc5fc1c1831d38d1900", "Wert": 47530}] ' – chridam

+0

Änderung des Schemas ist nicht möglich. Ich muss vielleicht dieses oder etwas überspringen ... Danke @chridam –

Antwort

1

Sie MongoDB $where ist wie diese verwenden:

db.myCollection.find({ $where: function() { 
    for (var key in obj.targetKeyToOrgIdMap) { 
    if (obj.targetKeyToOrgIdMap[key] == 46784){ 
     return true; 
    } 
    } 
}}).each { obj -> 
    println obj 
} 

aber bewusst sein, dass dies eine vollständige Tabellen-Scan erfordert, wo die Funktion für jedes Dokument ausgeführt wird. Siehe documentation.

+0

Das sieht vielversprechend aus. Entschuldige meine Unwissenheit hier, ich bin sehr neu in MongoDB; Wie kann ich die Aufzeichnungen bekommen? Die Abfrage wird erfolgreich ausgeführt, aber es wurden keine Datensätze angezeigt. Ich habe versucht, einige Dinge wie Return Key/Return {} aber nicht funktioniert. Könntest du mir vielleicht dabei helfen? –

+0

Je nach verwendetem Datenbanktreiber gibt 'find' wahrscheinlich einen Datenbankcursor zurück, mit dem Sie auf die Ergebnisse zugreifen. Welchen Treiber verwendest du? – Erik

+0

Ich benutze Gmongo mit groovy. –