Ben yeni çıkıyorum. Fakat sorguları yazmanın en mantıklı yollarını öğrenmeye çalışıyorum.2 farklı alanda arama değeri mongodb + node.js
Şu şekilde olan koleksiyonum var;
{
"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)
}
]
}
Ben onların code
değerleri karşılık gelen bir key
oluşumunu listelemek istiyorum. Bir örnek key
olarak
michelangelo
Ben iki ayırıcı aggregation
sorguları yazdım, anahtarın oluşumunu bulmak için;
db.test.aggregate([
{$unwind: "$school"},
{$match : {"school.name" : "michelangelo"}},
{$project: {_id: "$id", "key" : "$school.name", "code" : "$school.code"}}
])
ve bu 2 sorguları
db.test.aggregate([
{$unwind: "$enrolledStudents"},
{$match : {"enrolledStudents.userName" : "michelangelo"}},
{$project: {_id: "$id", "key" : "$enrolledStudents.userName", "code" : "$enrolledStudents.code"}}
])
sonuç Ben istediğim dönmek; Bunlardan
{ "_id" : 1, "key" : "michelangelo", "code" : "01" }
{ "_id" : 2, "key" : "michelangelo", "code" : 25 }
Bir diğeri school
alanda aradığı, enrolledStudents
arama yapmak için.
Bu 2 sorgu daha mantıklı bir sorguya indirgenebilir mi? Yoksa bunu yapmanın tek yolu bu mu?
ps: Veritabanının yapısının mantıklı olmadığını biliyorum, ancak benzetmeye çalıştım.
düzenleme Bulmak için bir sorgu yazmayı deneyin. Bu, tüm belgeleri şu şekilde döndürür;
{
"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
}
]
}