2014-09-30 38 views
5

Tôi có một danh sách học sinh trong một bộ sưu tập và điểm số của họ trong một bộ sưu tập khác. Giản đồ (tước chi tiết khác) trông giống nhưTruy vấn tổng hợp Mongodb không có trong

Học sinh

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

lớp

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

Có thể có nhiều mục cấp cho mỗi học sinh. Tôi cần tổng số học sinh có mặt trong bảng điểm nhưng không có trong bảng học sinh. Tôi cũng cần một số điểm cho mỗi học sinh không có trong bảng học sinh. Sau đây là các truy vấn tôi đã viết,

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'}}} 
); 

Nhưng điều này trả về cho tôi tất cả các chi tiết sinh viên như thể trận đấu không hoạt động. Khi tôi chỉ chạy phần đầu tiên của truy vấn này, tôi nhận được chi tiết của sinh viên là

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

Tôi cảm thấy rằng vì giá trị trả về là hai kết quả trùng khớp không hoạt động. Cách thích hợp để có được điều này là gì?

+0

db.students.find ({}, {_id: 0, 'student.code': 1}) không cung cấp cho bạn hàng loạt các mã sinh viên. Nó cung cấp cho bạn một loạt các tài liệu có chứa field studentCodes.So $ nin không nhận ra nó. – mallik

Trả lời

8

Sử dụng mã này

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

Cảm ơn bạn. Điều này đã làm việc! – etrast81

+0

@mallik, toán tử $ nin sử dụng định dạng mảng. cập nhật câu trả lời của bạn ở định dạng sau. {$ nin: ['value1', 'value2']} –

+0

Nếu bạn đang sử dụng _id in hoặc không in, vui lòng sử dụng => ids = ids.map (hàm (el) {return mongoose.Types.ObjectId (el) }) –

Các vấn đề liên quan