2017-04-07 6 views
0

Im Versuch, spezifische Quiz in der Datenbank von id zu erhalten:

static getQuiz(db, id, cb){ //db is database connection, id is quiz id, cb is just callback 
     db.find({ _id : "8RA4Rey50eqKFlWK"}, {"quiz" : { $elemMatch : { _id : id}}}, function(err, Doc){ 
      if(cb){ 
       cb(err,Doc); 
       console.log(Doc); //only return _id : "8RA4Rey50eqKFlWK" 
      } 
     }) 
    } 

JSON Datenbank:

{ 
    "_id":"8RA4Rey50eqKFlWK", 
    "quiz":[ 
     { 
     "_id":"1b944055-2b15-4838-7e7a-beef4c9a5a62", 
     "title":"test", 
     "description":"" 
     }, 
     { 
     "_id":"7dc53529-206c-6003-1d3c-133264d7ad81", 
     "title":"aaaa", 
     "description":"" 
     }, 
     { 
     "_id":"db3c788f-56b3-f9c8-8a25-affb2981e12f", 
     "title":"lala", 
     "description":"" 
     }, 
     { 
     "_id":"20388c1f-1a00-4f7b-3d25-9db56247a6bf", 
     "title":"asdasd", 
     "description":"" 
     } 
    ] 
} 

obigen Code nicht funktioniert, bereits getestet mit:

db.find({ _id : "8RA4Rey50eqKFlWK"}, {"quiz" : { $elemMatch : { title : "test"}}}) 

aber Ergebnis nur noch root id => _id: "8RA4Rey50eqKFlWK".

i erwartet zur Folge haben, wenn Such Quiz von id "1b944055-2b15-4838-7e7a-beef4c9a5a62" sein sollte:

{ 
    "_id":"8RA4Rey50eqKFlWK", 
    "quiz":[ 
     { 
     "_id":"1b944055-2b15-4838-7e7a-beef4c9a5a62", 
     "title":"test", 
     "description":"" 
     }, 
    ] 
} 

Irgendwelche Lösungen? Im tatsächlich mit NeDB https://github.com/louischatriot/nedb die gleiche Syntax wie MongoDB ist. danke

EDIT: ich versuchte meinen Code mit mongodb Konsole, funktioniert es schön! vielleicht ist das nur NeDB Bug?

+0

Ich habe Ihren Code jetzt in Mongo2.6.9 versucht und gibt das erwartete Ergebnis zurück. –

+0

Ja, das sieht wie eine Funktionalität aus, die nicht in nedb bereitgestellt wird. Hast du eine Positionsvariante ausprobiert? 'db.find ({_id:" 8RA4Rey50eqKFlWK "," Quiz ": {$ elemMatch: {title:" test "}}}, {" quiz. $ ": 1})' oder 'db.find ({_id: "8RA4Rey50eqKFlWK", "quiz.title": "test"}, {"quiz. $": 1}) ' – Veeram

+0

Es sieht so aus, als wollten Sie nur ein bestimmtes Element des" Quiz "-Arrays zurückgeben. $ elemMatch wird verwendet, um basierend auf Elementen des Arrays zu passen, gibt aber immer noch das gesamte Dokument zurück. Siehe unten meine Antwort zur Verwendung des Aggregationsframeworks zur Neustrukturierung des Dokuments. –

Antwort

0
 db.a.find(  
      {_id : "8RA4Rey50eqKFlWK"}, 
      { 
      "quiz" : { 
        $elemMatch : { "title" : "test"} 
        } 
      }); 

verpassen Dinkel Titel _title

+0

oops. Ich vermisse hier geschrieben, aber nicht in meinem eigentlichen Code. Es tut uns leid. – tonywei

0

du versuchen:

db.collection.find({ 
     _id: "8RA4Rey50eqKFlWK", 
     "quiz" : { 
      $elemMatch : { "title" : "test"} 
       }}); 
+0

versuchte Ihren Code, das Ergebnis sind alle Daten in der Datenbank. danke trotzdem – tonywei

+0

BTW, ich versuchte es in mongodb Konsole, der Code funktioniert gut, vielleicht ist es nur nedb spezifischen Bug. idk – tonywei

+0

Wirklich leid !!! Meine Schuld jetzt lese ich nochmal deine Anfrage. Ich werde wieder versuchen, das Problem zu lösen –

0

Wenn ich richtig verstehe, Sie wollen eine Abfrage das Dokument in in Ihrer Nachricht zurückzukehren (die mit "_id":"8RA4Rey50eqKFlWK") und nur das Quiz mit "_id":"1b944055-2b15-4838-7e7a-beef4c9a5a62" anzeigen, ist das korrekt?

Wenn ja, müssen Sie die aggregation framework verwenden.

Die folgende Aggregation Rahmen Abfrage wird für das Dokument durch _id abzufragen, der "Quiz" array abwickeln und den spezifischen Unter Dokument in dem Array filtern:

db.quiz.aggregate([ 
{ "$match" : { _id: "8RA4Rey50eqKFlWK" } }, 
{ "$unwind" : "$quiz" }, 
{ "$match" : { "quiz._id" : "1b944055-2b15-4838-7e7a-beef4c9a5a62" } } 
]) 

Returns:

{ "_id" : "8RA4Rey50eqKFlWK", "quiz" : { "_id" : "1b944055-2b15-4838-7e7a-beef4c9a5a62", "title" : "test", "description" : "" } } 

Ich habe eine detaillierte Aufschlüsselung der Aggregation Framework in einem anderen meiner answers.

+0

Ich versuchte mit NeDB, Aggregat() wird nicht unterstützt, aber trotzdem danke Mr.Harrison – tonywei

Verwandte Themen