2014-07-06 15 views
16

Tôi không thể giới hạn số lượng các phần tử được đẩy trong một chức năng nhóm với đường ống tổng hợp. Điều này có thể không? ví dụ nhỏ:Đường ống tập hợp Mongodb làm thế nào để giới hạn một nhóm push

dữ liệu:

[ 
    { 
     "submitted": date, 
     "loc": { 
      "lng": 13.739251, 
      "lat": 51.049893 
     }, 
     "name": "first", 
     "preview": "my first" 
    }, 
    { 
     "submitted": date, 
     "loc": { 
      "lng": 13.639241, 
      "lat": 51.149883 
     }, 
     "name": "second", 
     "preview": "my second" 
    }, 
    { 
     "submitted": date, 
     "loc": { 
      "lng": 13.715422, 
      "lat": 51.056384 
     }, 
     "name": "nearpoint2", 
     "preview": "my nearpoint2" 
    } 
] 

Đây là đường ống kết hợp của tôi:

var pipeline = [{ 
    //I want to limit the data to a certain area 
    $match: { 
     loc: { 
      $geoWithin: { 
       $box: [ 
        [locBottomLeft.lng, locBottomLeft.lat], 
        [locUpperRight.lng, locUpperRight.lat] 
       ] 
      } 
     } 
    } 
}, 
// I just want to get the latest entries 
{ 
    $sort: { 
     submitted: -1 
    } 
}, 
// I group by name 
{ 
    $group: { 
     _id: "$name", 
     < --get name 
     submitted: { 
      $max: "$submitted" 
     }, 
     < --get the latest date 
     locs: { 
      $push: "$loc" 
     }, 
     < --push every loc into an array THIS SHOULD BE LIMITED TO AN AMOUNT 5 or 10 
     preview: { 
      $first: "$preview" 
     } 
    } 
}, 
//Limit the query to at least 10 entries. 
{ 
    $limit: 10 
} 
]; 

Làm thế nào tôi có thể giới hạn mảng locs-10 hoặc bất kỳ kích thước khác? Tôi đã thử một cái gì đó với $each$slice nhưng điều đó dường như không hoạt động.

Trả lời

14

Giả sử tọa độ dưới cùng bên trái và tọa độ phía trên bên phải tương ứng là [0, 0][100, 100]. Từ MongoDB 3.2 bạn có thể sử dụng toán tử $slice để trả lại một tập con của một mảng mà bạn muốn.

db.collection.aggregate([ 
    { "$match": { 
     "loc": { 
      "$geoWithin": { 
       "$box": [ 
        [0, 0], 
        [100, 100] 
       ] 
      } 
     }} 
    }}, 
    { "$group": { 
     "_id": "$name", 
     "submitted": { "$max": "$submitted" }, 
     "preview": { "$first": "$preview" } 
     "locs": { "$push": "$loc" } 
    }}, 
    { "$project": { 
     "locs": { "$slice": [ "$locs", 5 ] }, 
     "preview": 1, 
     "submitted": 1 
    }}, 
    { "$limit": 10 } 
]) 
+0

Có không có cách nào để làm điều này trực tiếp chỉ bằng cách ấn? – Nickpick

+0

Bạn không thể thực hiện việc này tại thời điểm này @Nickpick – styvane

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