MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:come scoprire se un campo array contiene un elemento?

[modifica in base al fatto che ora è possibile nelle versioni recenti]

[Risposta aggiornata] Puoi interrogare nel modo seguente per recuperare il nome della classe e l'ID studente solo se sono già iscritti.

db.student.find({},
 {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})

e riceverai ciò che ti aspettavi:

{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }

[Risposta originale] Non è possibile fare quello che vuoi fare attualmente. Questo è un peccato perché potresti farlo se lo studente fosse archiviato nell'array come oggetto. In effetti, sono un po' sorpreso che tu stia usando solo ObjectId() poiché ciò sempre richiedono di cercare gli studenti se si desidera visualizzare un elenco di studenti iscritti a un determinato corso (cercare prima l'elenco degli ID, quindi cercare i nomi nella raccolta studenti:due query anziché una!)

Se stavi memorizzando (ad esempio) un ID e un nome nell'array del corso in questo modo:

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
        ]
}

La tua domanda quindi sarebbe semplicemente:

db.course.find( { }, 
                { students : 
                    { $elemMatch : 
                       { id : ObjectId("51780f796ec4051a536015d0"), 
                         name : "Sam" 
                       } 
                    } 
                } 
);

Se quello studente fosse solo iscritto a CS 101, torneresti:

{ "name" : "Literature" }
{ "name" : "Physics" }
{
    "name" : "CS 101",
    "students" : [
        {
            "id" : ObjectId("51780f796ec4051a536015cf"),
            "name" : "John"
        }
    ]
}