MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:Como descobrir se um campo de matriz contém um elemento?


[editar com base nisso agora sendo possível em versões recentes]

[Resposta atualizada] Você pode consultar a seguinte maneira de recuperar o nome da turma e o ID do aluno somente se eles já estiverem matriculados.
db.student.find({},
 {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})

e você receberá de volta o que esperava:
{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }

[Resposta original] Não é possível fazer o que você deseja atualmente. Isso é lamentável porque você poderia fazer isso se o aluno fosse armazenado na matriz como um objeto. Na verdade, estou um pouco surpreso que você esteja usando apenas ObjectId(), pois isso sempre exigir que você procure os alunos se quiser exibir uma lista de alunos matriculados em um curso específico (procure primeiro a lista de IDs e depois procure os nomes na coleção de alunos - duas consultas em vez de uma!)

Se você estivesse armazenando (como exemplo) um Id e um nome no array do curso assim:
{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
        ]
}

Sua consulta então seria simplesmente:
db.course.find( { }, 
                { students : 
                    { $elemMatch : 
                       { id : ObjectId("51780f796ec4051a536015d0"), 
                         name : "Sam" 
                       } 
                    } 
                } 
);

Se esse aluno estivesse matriculado apenas no CS 101, você receberia de volta:
{ "name" : "Literature" }
{ "name" : "Physics" }
{
    "name" : "CS 101",
    "students" : [
        {
            "id" : ObjectId("51780f796ec4051a536015cf"),
            "name" : "John"
        }
    ]
}