5

tôi có bộ sưu tập MongoDB gọi thay đổi chứa dữ liệu sauLàm thế nào để chuyển đổi MongoDB truy vấn tập hợp để Laravel MongoDB bởi jenssegers

{ 
    "date" : ISODate("2014-06-09T00:00:00.000Z"), 
    "field" : "ip", 
    "from" : "157.11.209.123", 
    "to" : "107.21.109.254" 
} 
{ 
    "date" : ISODate("2014-05-15T00:00:00.000Z"), 
    "field" : "ip", 
    "from" : "107.21.109.254", 
    "to" : "157.11.209.123" 
} 
{ 
    "date" : ISODate("2014-06-09T00:00:00.000Z"), 
    "field" : "registration", 
    "from" : "Old service", 
    "to" : "Some new service" 
} 

Sau đó, tôi muốn thực hiện truy vấn SQL điển hình mà đếm lần xuất hiện và nhóm nó bằng cách field. Vì vậy, tôi đã tạo truy vấn trong MongoDB

db.changes.group({ 
    "key": { 
     "field": true 
    }, 
    "initial": { 
     "count": 0, 
    }, 
    "reduce": function(obj, prev) { 
      prev.count++; 
    }, 
}); 

Nó hoạt động tốt nhưng làm thế nào tôi có thể chuyển nó sang làm việc với Laravel 4? Tôi đang sử dụng jenssegers/laravel-mongodb để giao tiếp với máy chủ mongo. Ngoài ra, tôi có nhiều điều kiện hơn trong truy vấn mà tôi đã xóa để làm cho câu hỏi của mình trông rõ ràng hơn, vì vậy tôi đang tìm giải pháp để chuyển chính xác truy vấn đó thành laravel, chứ không phải các giải pháp có thể khác :).

Trả lời

8

Bạn nên sử dụng các phương pháp khung tổng hợp và cũng đi sâu vào đối tượng bộ sưu tập MongoDB thô được cung cấp từ trình điều khiển cơ bản để làm như vậy. Đó là một lựa chọn tốt hơn nhiều mà cố gắng để dịch cú pháp:

// Returns the original Mongo Result 
$result = DB::collection('changes')->raw(function($collection) 
{ 
    return $collection->aggregate(array(
     array(
      '$group' => array(
       '_id' => '$field', 
       'count' => array(
        '$sum' => 1 
       ) 
      ) 
     ) 
    )); 
}); 

Kết quả là một chút khác biệt so với kết quả của một phương pháp như .group() nhưng điều này sử dụng mã gốc trên máy chủ MongoDB và không dựa vào việc giải thích Javascript như phương thức .group() thực sự làm, thực sự là một trình bao bọc xung quanh mapReduce.

Kết quả cuối cùng nhanh hơn nhiều và cũng thường hiệu quả hơn bạn sẽ thoát khỏi giao diện khung gốc.

Vì vậy, hãy sử dụng cách MongoDB gốc để có hiệu suất tốt nhất.

+0

Ok, điều đó thật tuyệt vời, nhưng có thể có một nhược điểm. Tôi cần tính toán mọi thứ trong một khoảng thời gian (trong tuần trước và tháng trước). Tôi không muốn chạy 2 truy vấn, trong khi tôi có thể tạo một truy vấn. Tôi đã đính kèm truy vấn ban đầu của mình. Làm thế nào tôi có thể chạy chức năng giảm tùy chỉnh trong ví dụ của bạn? –

+2

@estshy Nó thực sự không phải là một ý tưởng tốt để thay đổi câu hỏi của bạn theo cách bạn có. Nó là rất gây hiểu lầm cho những người đến và thấy rằng câu trả lời được cung cấp không phù hợp với những gì bạn đã yêu cầu. Nếu bạn đăng một câu hỏi khác, tôi sẽ như những người khác vui vẻ trả lời câu hỏi đó. Trường hợp chung ở đây là một câu hỏi một câu trả lời. Tôi có thể trả lời câu hỏi bổ sung của bạn nhưng nó phải là một câu hỏi khác hoàn toàn. Xin vui lòng gửi nó một cách riêng biệt. –

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