2017-01-31 14 views
11

Tôi có ba kiểu: user, nounusernoun (user_noun trong PHP/Eloquent). Có mối quan hệ nhiều đến nhiều giữa usernoun. Bảng "tổng hợp" có thuộc tính bổ sung score. Tôi có thể sử dụng truy vấn này với hùng hồn cho tính tổng điểm của mỗi danh từ người dùng có để có được tổng số điểm của người dùng:Cách chọn, nhómBởi và tham gia vào Đường nước hoặc MongoDB

$users = User::leftJoin('noun_user', 'user.id', 'noun_user.user_id') 
    ->groupBy('user.id') 
    ->select('user.*', DB::raw('sum(noun_user.score) as score')) 
    ->orderBy('score', 'desc') 
    ->get(); 

Nhưng tôi không thể tìm ra cách để có được điều này để làm việc trong mực nước. Điều này có hiệu quả, nhưng không phải khi tôi bỏ ghi chú dòng .populate('user'). Tôi cần user để được điền.

UserNoun 
    .find({}) 
    //.populate('user') 
    .groupBy('user') 
    .sum('score') 
    .sort({ score: 'desc' }) 
    .exec((err, usernouns) => { 
    return res.json(usernouns) 
}) 

đây là một truy vấn .native() rằng hoạt động:

UserNoun.native(function(err, collection) { 
    collection.aggregate([ 
     { 
      $lookup: { 
       from: 'user', 
       localField: 'user', 
       foreignField: '_id', 
       as: 'user' 
      } 
     }, 
     { 
      $group: { _id: '$user', total: { $sum: '$score' } } 
     }, 
     { 
      $sort : { total: -1 } 
     } 
    ]).toArray(function (err, results) { 
     return res.json(results) 
    }) 
}) 

truy vấn nguồn gốc này có thể được viết lại bằng đường dọc tâm với groupBypopulatesum?

Trả lời

0

Bạn không thể tham gia với đường nước như hiện tại, bạn sẽ phải sử dụng truy vấn thô cho điều đó. dân cư sẽ chỉ cư các lĩnh vực liên quan, nó không trả lại cho bạn kết quả cách sql tham gia trả về nó.

đường dọc tâm vào thời điểm này chỉ hỗ trợ sử dụng groupby kết hợp với sum(), count() vv

Đối groupby và sắp xếp bạn có thể sử dụng như sau:

Model.find() 
.groupBy('term') 
.sum('count') 
.limit(20) 
.sort({count: 'desc'}) 
.exec(function (err, data){ 
//Your code here.. 
}); 
+0

bạn có thể vui lòng chia sẻ liên kết tài liệu tham khảo cho ' phương thức groupBy' và 'sum'? – Sangharsh

+0

Không thể tìm thấy tài liệu chính xác, nhưng tôi đã thử truy vấn, groupby trong buồm hoạt động với một hàm tính toán. Đã tìm thấy một liên kết - http://stackoverflow.com/questions/20254910/how-do-i-perform-this-query-using-sailsjs-orm-waterline –

5

Như của [email protected], cách duy nhất để làm điều đó là sử dụng các truy vấn gốc.

Bằng cách này, bạn có thể xuất phương pháp của bạn bên trong mô hình tài:

// User.js 
module.exports = { 

    // ... 

    findTotalScores: function (callback) { 
     UserNoun.native(function(err, collection) { 
      if (err) { 
       return callback(err); 
      } 

      collection.aggregate([ 
       { 
        $lookup: { 
         from: 'user', 
         localField: 'user', 
         foreignField: '_id', 
         as: 'user' 
        } 
       }, 
       { 
        $group: { _id: '$user', total: { $sum: '$score' } } 
       }, 
       { 
        $sort : { total: -1 } 
       } 
      ]).toArray(callback); 
     }); 
    } 

}; 

Và bạn có thể sử dụng nó trong điều khiển của bạn bằng cách gọi:

User.findTotalScores(function (err, results) { 
    return res.json(results); 
}); 
Các vấn đề liên quan