2014-09-30 16 views
5
ile

Bir koleksiyondaki öğrencilerden ve diğer koleksiyonlardaki notlarım var. (Diğer ayrıntıları elimden) şemaMongodb toplama sorgusu

Öğrenci

{ 
    _id: 1234, 
    student: { 
     code: "WUKD984KUK" 
    } 
} 

sınıflar

{ 
    _id: 3456, 
    grade: 24, 
    studentCode: "WUKD984KUK" 
} 

her öğrenci için birden fazla sınıf girişleri olabilir benziyor. Öğrenci tablosunda bulunmayan, ancak not tablosunda bulunan toplam öğrenci sayısına ihtiyacım var. Ayrıca, öğrenci masasında olmayan her öğrenci için bir dereceye ihtiyacım var. Aşağıdaki ben yazmıştım sorgu,

var existingStudents = db.students.find({}, {_id: 0, 'student.code': 1}); 

db.grades.aggregate(
    {$match: { 'studentCode': {'$nin': existingStudents}}}, 
    {$group: {_id: '$studentCode', count:{$sum: 1}}}, 
    {$project: {tmp: {code: '$_id', count: '$count'}}}, 
    {$group: {_id: null, total:{$sum:1}, data:{$addToSet: '$tmp'}}} 
); 

olduğunu Ama maç çalışmıyor sanki bu öğrenci tüm ayrıntıları beni döndürür. Bu sorgunun sadece ilk bölümünü çalıştırdığınızda, ben

{ "student" : { "code" : "A210225504104" } } 

olarak öğrenci bilgi almak Hissediyorum ki dönüş değeri iki derin maç isnt çalışma olduğu için. Bunu elde etmenin doğru yolu nedir?

+0

db.students.find ({}, {_ID: 0, 'student.code': 1}) Öğrenci kodlarının size dizi vermez. Bu size studentCodes.So $ nin içeren belgeleri içeren bir dizi belge verir. – mallik

cevap

8

kullanın bu kod

var existingStudents=[]; 
db.students.find({}, {_id: 0, 'student.code': 1}).forEach(function(doc){existingStudents.push(doc.student.code)}) 

db.grades.aggregate(
    {$match: { 'studentCode': {'$nin': existingStudents}}}, 
    {$group: {_id: '$studentCode', count:{$sum: 1}}}, 
    {$project: {tmp: {code: '$_id', count: '$count'}}}, 
    {$group: {_id: null, total:{$sum:1}, data:{$addToSet: '$tmp'}}} 
); 
+0

Teşekkürler. Bu işe yaradı! – etrast81

+0

@mallik, $ nin operatör dizi biçimini kullanır. Cevabınızı aşağıdaki biçimde güncelleyin. {$ nin: ['value1', 'value2']} –

+0

Eğer _id içeride veya değilken, lütfen bu => ids = ids.map (function (el) {return mongoose.Types.ObjectId (el) 'i kullanın. }) –