sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB:Hur tar man reda på om ett arrayfält innehåller ett element?

[redigera baserat på att detta nu är möjligt i de senaste versionerna]

[Uppdaterat svar] Du kan fråga på följande sätt för att få tillbaka namnet på klassen och elev-id endast om de redan är inskrivna.

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

och du får tillbaka det du förväntade dig:

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

[Originalt svar] Det är inte möjligt att göra det du vill göra just nu. Detta är olyckligt eftersom du skulle kunna göra detta om eleven lagrades i arrayen som ett objekt. Jag är faktiskt lite förvånad över att du bara använder ObjectId() eftersom det alltid kräver att du slår upp eleverna om du vill visa en lista över studenter som är inskrivna i en viss kurs (sök först upp listan med Id:n och slå sedan upp namnen i studentsamlingen - två frågor istället för en!)

Om du lagrade (som ett exempel) ett Id och namn i kursuppsättningen så här:

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

Din fråga skulle då helt enkelt vara:

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

Om den studenten bara var inskriven i CS 101 skulle du få tillbaka:

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


  1. MongoDB forEach()

  2. skapa och uppdatera flera MongoDB-dokument i ett samtal

  3. ZRANGESTORE före Redis 6.2.0

  4. Mongoose:Få hela listan över användare