Jestem nowicjuszem. Ale staram się nauczyć najbardziej logicznych sposobów pisania zapytań.Wartość wyszukiwania w 2 różnych polach mongodb + node.js
Załóżmy, że mam kolekcję, która jest jak;
{
"id" : NumberInt(1),
"school" : [
{
"name" : "george",
"code" : "01"
},
{
"name" : "michelangelo",
"code" : "01"
}
],
"enrolledStudents" : [
{
"userName" : "elisabeth",
"code" : NumberInt(21)
}
]
}
{
"id" : NumberInt(2),
"school" : [
{
"name" : "leonarda da vinci",
"code" : "01"
}
],
"enrolledStudents" : [
{
"userName" : "michelangelo",
"code" : NumberInt(25)
}
]
}
Chcę wymienić wystąpienie o key
z odpowiadającymi im code
wartości.
Jako przykład key
: michelangelo
aby znaleźć wystąpienie klucza, napisałem dwa tarasowy aggregation
zapytań jak;
db.test.aggregate([
{$unwind: "$school"},
{$match : {"school.name" : "michelangelo"}},
{$project: {_id: "$id", "key" : "$school.name", "code" : "$school.code"}}
])
i
db.test.aggregate([
{$unwind: "$enrolledStudents"},
{$match : {"enrolledStudents.userName" : "michelangelo"}},
{$project: {_id: "$id", "key" : "$enrolledStudents.userName", "code" : "$enrolledStudents.code"}}
])
wynikiem tych 2 zapytaniami powrócić czego chcę jak;
{ "_id" : 1, "key" : "michelangelo", "code" : "01" }
{ "_id" : 2, "key" : "michelangelo", "code" : 25 }
Jeden z nich, aby szukać w enrolledStudents
, drugi szuka w school
dziedzinie.
Czy te 2 zapytania można zredukować do bardziej logicznego zapytania? A może to jedyny sposób na zrobienie tego?
ps: Wiem, że struktura bazy danych nie jest logiczna, ale próbowałem symulować.
edycja Próbuję napisać zapytanie z find.
db.test.find({$or: [{"enrolledStudents.userName" : "michelangelo"} , {"school.name" : "michelangelo"}]}).pretty()
ale to zwraca całą dokumentację jako;
{
"id" : 1,
"school" : [
{
"name" : "george",
"code" : "01"
},
{
"name" : "michelangelo",
"code" : "01"
}
],
"enrolledStudents" : [
{
"userName" : "elisabeth",
"code" : 21
}
]
}
{
"id" : 2,
"school" : [
{
"name" : "leonarda da vinci",
"code" : "01"
}
],
"enrolledStudents" : [
{
"userName" : "michelangelo",
"code" : 25
}
]
}