2016-06-16 21 views
5

Ecco la mia struttura del databaseGet elemento casuale dalla matrice in MongoDB

{ 
    "_id" : ObjectId("576155226d1d298c2cc3edca"), 
    "questionLibrary" : { 
      "technologyName" : "CSS", 
      "questions" : [ 
        { 
          "correctanswer" : { 
            "A1" : "CSS1" 
          }, 
          "answeroption" : { 
            "A4" : "CSS1", 
            "A3" : "CSS1", 
            "A2" : "CSS1", 
            "A1" : "CSS1" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS1" 
        }, 
        { 
          "question" : "CSS2", 
          "tags" : "CSS", 
          "answeroption" : { 
            "A1" : "CSS2", 
            "A2" : "CSS2", 
            "A3" : "CSS2", 
            "A4" : "CSS2" 
          }, 
          "level" : "Amature", 
          "correctanswer" : { 
            "A1" : "CSS2" 
          } 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS3" 
          }, 
          "answeroption" : { 
            "A4" : "CSS3", 
            "A3" : "CSS3", 
            "A2" : "CSS3", 
            "A1" : "CSS3" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS3" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS4" 
          }, 
          "answeroption" : { 
            "A4" : "CSS4", 
            "A3" : "CSS4", 
            "A2" : "CSS4", 
            "A1" : "CSS4" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS4" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS5" 
          }, 
          "answeroption" : { 
            "A4" : "CSS5", 
            "A3" : "CSS5", 
            "A2" : "CSS5", 
            "A1" : "CSS5" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS5" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS6" 
          }, 
          "answeroption" : { 
            "A4" : "CSS6", 
            "A3" : "CSS6", 
            "A2" : "CSS6", 
            "A1" : "CSS6" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS6" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS7" 
          }, 
          "answeroption" : { 
            "A4" : "CSS7", 
            "A3" : "CSS7", 
            "A2" : "CSS7", 
            "A1" : "CSS7" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS7" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS8" 
          }, 
          "answeroption" : { 
            "A4" : "CSS8", 
            "A3" : "CSS8", 
            "A2" : "CSS8", 
            "A1" : "CSS8" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS8" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS9" 
          }, 
          "answeroption" : { 
            "A4" : "CSS9", 
            "A3" : "CSS9", 
            "A2" : "CSS9", 
            "A1" : "CSS9" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS9" 
        }, 
        { 
          "correctanswer" : { 
            "A1" : "CSS10" 
          }, 
          "answeroption" : { 
            "A4" : "CSS10", 
            "A3" : "CSS10", 
            "A2" : "CSS10", 
            "A1" : "CSS10" 
          }, 
          "level" : "Amature", 
          "tags" : "CSS", 
          "question" : "CSS10" 
        } 
      ] 
    }, 
    "__v" : 3 
} 

dalla matrice domanda, voglio ottenere un oggetto casuale (domanda casuale) ogni volta che mi sparo la query.

Non voglio raccogliere tutti gli oggetti alla volta e gestirli nel nodo. È possibile scrivere una query in modo che restituisca un oggetto casuale ogni volta?

+2

Suggerirei di rimodellare lo schema per denormalizzare l'array 'questions' memorizzando i dati in una raccolta separata, ad esempio' domande'. Puoi quindi utilizzare facilmente l'operatore [** '$ sample' **] (https://docs.mongodb.com/master/reference/operator/aggregation/sample/#pipe._S_sample) della pipeline di aggregazione insieme a un filtro su il tag per disegnare un documento di esempio. È molto più facile interrogare in questo modo. Una query di esempio potrebbe essere 'db.questions.aggregate ([{" $ sample ": {" size ": 1}}])' – chridam

risposta

1

Prova questa logica

1) utilizzare $unwind sulla matrice "domande", se si utilizza includeArrayIndex, si creerà documenti con indice di vedere examples nella documentazione rilassarsi

2) Dopo lo svolgimento della matrice passa un numero casuale per recuperare una domanda

1

È necessario de-normalizzare la matrice "domande" utilizzando l'operatore $unwind. Da lì è possibile utilizzare l'operatore pipeline $sample per restituire un documento casuale (domanda casuale).

db.collection.aggregate(
    [ 
     { "$unwind": "$questionLibrary.questions" }, 
     { "$sample": { "size": 1 } } 
    ] 
) 

Ma ti suggerisco di cambiare la struttura del documento e salvare "domande" in esso propria collezione perché $unwind può produrre un grande risultato.

Problemi correlati