2012-04-06 5 views
2

Wie Wert in mehrdimensionales Array suchen, zum Beispiel mag ich example Schlüsselwort in den folgenden Daten in mongodb Früher habe ich holen alle Daten von BefehlWie suche ich einen String im inneren Array mit mongodb?

>db.info.find()

{ 
    "_id" : ObjectId("4f74737cc3a51043d26f4b90"), 
    "id" : "12345", 
    "info" : [ 
      { 
        "sno" : 1, 
        "name" : "ABC", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 2, 
        "name" : "XYZ", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 3, 
        "name" : "XYZ", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 4, 
        "name" : "ABC", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 5, 
        "name" : "Rohan", 
        "email" : "[email protected]" 
      } 
    ] 
} 

Jetzt suchen, finden Daten example zu haben habe ich Befehl

>db.info.find({"info.email":"example"}) und es gibt

{ 
    "_id" : ObjectId("4f74737cc3a51043d26f4b90"), 
    "id" : "12345", 
    "info" : [ 
      { 
        "sno" : 1, 
        "name" : "ABC", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 2, 
        "name" : "XYZ", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 3, 
        "name" : "XYZ", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 4, 
        "name" : "ABC", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 5, 
        "name" : "Rohan", 
        "email" : "[email protected]" 
      } 
    ] 
} 

Aber ich will nur 3 von 5 Unter Reihen wie

{ 
    "_id" : ObjectId("4f74737cc3a51043d26f4b90"), 
    "id" : "12345", 
    "info" : [ 
      { 
        "sno" : 1, 
        "name" : "ABC", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 2, 
        "name" : "XYZ", 
        "email" : "[email protected]" 
      }, 
      { 
        "sno" : 5, 
        "name" : "Rohan", 
        "email" : "[email protected]" 
      } 
    ] 
} 

Antwort

1

Ich habe versucht, Map-Funktion reduzieren und es funktioniert auf diese Art von Problemen ist der Code so etwas wie das:

eine Map-Funktion schreiben

map=function() 
    { 
     filter = []; 
     this.info.forEach(function (s) {if (/example/.test(s.email)) {filter.push(s);}}); 
     emit(this._id, {info:filter}); 
    } 

Funktion

reduce=function(key, values) { return values;} 

eine Verringerung schreiben MapReduce-Funktion

res=db.info.mapReduce(map,reduce,{out:{inline:1}}) 

und der Ausgang Blick mag:

"results" : [ 
    { 
      "_id" : ObjectId("4f9a2de0ea4a65c3ab85a9d3"), 
      "value" : { 
        "info" : [ 
          { 
            "sno" : 1, 
            "name" : "ABC", 
            "email" : "[email protected]" 
          }, 
          { 
            "sno" : 2, 
            "name" : "XYZ", 
            "email" : "[email protected]" 
          }, 
          { 
            "sno" : 5, 
            "name" : "Rohan", 
            "email" : "[email protected]" 
          } 
        ] 
      } 
    } 
    ], 
    "timeMillis" : 1, 
    "counts" : { 
      "input" : 3, 
      "emit" : 3, 
      "reduce" : 0, 
      "output" : 3 
    }, 
    "ok" : 1, 

Jetzt können Sie Ihre Suchdaten von

printjson(res.results) 
2

Rohan, kehrt MongoDB immer die ganze Dokument, das Sie suchen auf. Sie können nicht einfach die Array-Elemente zurückgeben, in denen Ihr Keyword gefunden wurde. Wenn Sie das tun möchten, müssen Sie sicherstellen, dass alle eingebetteten Dokumente im Feld "info" in ihrer eigenen Sammlung sind. Und das könnte bedeuten, dass Sie sie wieder mit dem Originaldokument in Ihrer "Info" -Kollektion verknüpfen müssen. Vielleicht etwas wie:

{ 
    "sno" : 1, 
    "name" : "ABC", 
    "email" : "[email protected]" 
    "info_id" : "12345", 
}, 

Alternativ können Sie natürlich in PHP nachbearbeiten, um nur die Zeilen zu erhalten, die Sie wollen.

+1

Derick können wir sagen, dass es ein Nachteil von Mongodb ist? –

+0

Es ist etwas, für das MongoDB nicht entworfen wurde. Sie müssen sich jedoch bewusst sein, dass Ihre Map-Reduction-Lösung völlig andere Leistungsmerkmale haben wird und am Ende möglicherweise viel schlechter sein wird, wenn Sie dies gleichzeitig tun. Ich würde es immer noch empfehlen, es in dem Kunden zu tun. – Derick

0

Haben Sie $ (Projektion) versuchen finden?

db.info.find({"info.email":"example"}, {"info.email.$":1}) 

document

Verwandte Themen