Ниже у меня есть структура документа, разработанная следующим образом:
type MIS_Course struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string `bson:"crse_name"`
}
type MIS_Department struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string `bson:"dept_name"`
Courses []MIS_Course `bson:"crse_list"`
}
type MIS_School struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string `bson:"school_name"`
Departments []MIS_Department `bson:"dept_list"`
}
И при инициализации у меня будет «Школьная азбука» в море школ, содержащая что-то вроде следующего:
{
"_id" : ObjectId("55fbb522022aae7b3a000003"),
"school_name" : "School ABC",
"dept_list" : [
{
"dept_name" : "Department A",
"crse_list" : [
{
"crse_name" : "Class A"
},
{
"crse_name" : "Class B"
},
]
}
]
}
В течение нескольких часов я не мог найти решение, которое бы эффективно работало с учетом имени школы, имени отдела и имени crse:
Найдите dept_list
из school_name
> найдите crse_list
из dept_name
> найдите crse_name
Причина, по которой требуется такая цепочка находок, заключается в том, что область находки должна быть ограничена школой, а затем отделом. Логика и уборка происходит после каждого этапа находок.
Я пробовал код, такой как
result := MIS_School{}
err := database.C("schools").Find(bson.M{"school_name": school}).Select(
bson.M{"dept_list": bson.M{"$elemMatch": bson.M{"dept_name": dept}}}).Select(
bson.M{"crse_list": bson.M{"$elemMatch": bson.M{"crse_name": crse}}}).One(&result)
Но это не сработало, так как проекции Select не могут быть объединены в цепочку в Mgo (?)
Я где-то читал, что mongodb не имеет возможности напрямую извлекать документы, вложенные в массивы глубже 1-2 уровней (получение документа C внутри массива B внутри массива A). Это правда? Как я могу обойти эту проблему?
Спасибо!