sql >> Database >  >> NoSQL >> MongoDB

MongoDB:Hoe kom ik erachter of een arrayveld een element bevat?

[bewerken op basis hiervan dat dit nu mogelijk is in recente versies]

[Bijgewerkt antwoord] Je kunt de volgende manier opvragen om de naam van de klas en de student-ID terug te krijgen, alleen als ze al zijn ingeschreven.

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

en je krijgt terug wat je verwachtte:

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

[Oorspronkelijke antwoord] Het is momenteel niet mogelijk om te doen wat u wilt doen. Dit is jammer omdat je dit zou kunnen doen als de student als object in de array was opgeslagen. Het verbaast me zelfs een beetje dat je alleen ObjectId() gebruikt, want dat zal altijd vereisen dat je de studenten opzoekt als je een lijst wilt weergeven van studenten die zijn ingeschreven voor een bepaalde cursus (zoek eerst de lijst met ID's op en zoek dan de namen op in de studentencollectie - twee zoekopdrachten in plaats van één!)

Als u (als voorbeeld) een id en naam opslaat in de cursusarray als volgt:

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

Uw vraag zou dan eenvoudig zijn:

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

Als die student alleen was ingeschreven voor CS 101, zou je het volgende terugkrijgen:

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


  1. Hoe test je een methode die verbinding maakt met mongo, zonder daadwerkelijk verbinding te maken met mongo?

  2. Hoe zorgt u ervoor dat uw MongoDB-clusters Amazon AWS-storingen kunnen overleven?

  3. configureer redis auth op sidekiq

  4. ClusterControl - Alle hoogtepunten en verbeteringen van functies vanaf 2017