2016-11-28 113 views
0

我有一点设计问题。填充从一个集合到另一个集合减少数据流星Js

说香港专业教育学院有两个类别:

Colletion A stores apples (_id , appleName) 

Collection B stores apple votes (_id , apple_id , enum(0,1)) 

我想,然后返回集合的一个基于降低apple_id集合B的为0的值作为财产返还1周的主要对象。 (如一个分数)

实施例的数据:

集合A排列

[{_id : 1, appleName : 'grannySmith'},{_id : 2, appleName : 'greenApple'},{_id : 3, appleName : 'anotherApple'}] 

集合B排列

[{_id : 1, appleId : 1, vote : 0}, {_id : 2, appleId : 1, vote : 1}, {_id : 3, appleId : 1, vote : 1}] 

从该进出口寻找集合的与减少B的返回

集合减少数组

[{_id : 1, appleName : 'grannySmith', score : 2},{_id : 2, appleName : 'greenApple'},{_id : 3, appleName : 'anotherApple'}] 

见,因为它现在已经从降低集合B的与链接标识

2的比分
+0

您应该根据这些数据包括一些样本数据和您的预期结果 – Khang

+0

@Khang欢呼,刚刚添加了一些。 –

回答

0

你可以使用聚合来实现它:

db.apple.aggregate([ 
    { 
    $lookup: { 
     from: 'score', 
     localField: '_id', 
     foreignField: 'appleId', 
     as: 'scores', 
    }, 
    }, { 
    $unwind: { 
     path: '$scores', 
     preserveNullAndEmptyArrays: true, 
    }, 
    }, { 
    $group: { 
     _id: '$_id', 
     appleName: { 
     $first: '$appleName', 
     }, 
     score: { 
     $sum: '$scores.vote', 
     } 
    }, 
    } 
]) 

注:我在使用$lookup此聚合的第一阶段,您需要使用Mongo 3.2或更高版本才能运行。

+0

这似乎是更好的方式来做到这一点谢谢你,已经做了一个'苹果'情况的粗略测试,所以将作为完整的答案与此。 –

相关问题