2017-05-06 18 views
7

Tôi đã cập nhật Mongo và bây giờ trong log các lỗi sau xuất hiện: Sử dụng lệnh tổng hợp mà không có sự lựa chọn con trỏ bị phảnPHP MongoDB - Sử dụng lệnh tổng hợp không có tùy chọn con trỏ sẽ không còn được dùng nữa. Gì?

Mongo nói rằng tôi nên đặt một tham số REQUIRED thứ hai để tổng hợp chức năng, bởi vì việc sử dụng hiện tại của tôi không được chấp nhận.

Tôi hiện đang sử dụng PHP sau mã (hiện đang bị phản đối):

$this->db->{$collection}->aggregate($options); 

Và trở lại định dạng này:

{"result":[ 
    { 
    "_id":"xxxxxx", 
    "update":[ 
    { 
    "firstUpdateTime":xxxxxx, 
    "updateTime":xxxxxxx, 
    } 
    ], 
    "media":[ 
    { 
    "xxxx":{ ... 

Để không sử dụng một mã phản đối tôi thêm tham số thứ hai mới (nhưng tôi không hiểu phải đặt gì):

$this->db->{$collection}->aggregate($options, array('cursor' => array('batchSize' => 101))); 

Và điều này sẽ trả về thông tin tương tự nhưng thay đổi cấu trúc ban đầu:

{"cursor":{ 
"id":{ 
"value":"xxxxxx" 
}, 
"ns":"xxxxxx.instagram", 
"firstBatch":[ 
{ 
"_id":"xxxxxx", 
"update":[ 
{ 
"firstUpdateTime":xxxxxx, 
"updateTime":xxxxxx, 
} 
], 
"media":[ 
{ 
"xxxxxx":{ ... 

Sau khi cập nhật Mongo buộc tôi phải thay đổi cách tôi đọc dữ liệu. Tôi không hiểu giá trị nào tôi nên đặt trong tham số thứ hai được gọi là "con trỏ" ...

Tôi nên đặt thông số thứ hai vào thứ gì? Tôi có thể đặt giá trị mặc định mà không thay đổi cấu trúc của kết quả không?

Đốc: https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/ http://php.net/manual/es/mongocollection.aggregate.php

UPDATE:

Nếu tôi chỉ ra con trỏ trong hàm tôi không còn nhận được lỗi. Nhưng mà không áp dụng cho giải pháp, tôi đọc LOG và cảnh báo xuất hiện ngẫu nhiên, tôi có một mã mà tôi chạy nhiều lần và đôi khi nếu nó báo cáo cảnh báo được đề cập và những người khác thì không.

Tại sao?

+0

bạn có thể vui lòng thêm mã bao gồm các thông điệp log có và không có tùy chọn con trỏ đó chứng minh hành vi mà bạn đã đề cập trong bản cập nhật? – Veeram

+0

rerer vào [post] này (http://stackoverflow.com/q/40934922/6521116) để sử dụng con trỏ. –

Trả lời

3

Khi bạn truy vấn cái gì đó để MongoDB và bạn mong đợi kết quả, bạn sẽ có điều này biến gọi cursor, mà chỉ đơn giản là một con trỏ đến các tài liệu mà bạn hiện đã đọc. Nó giống như một thanh cuộn trong trình duyệt.

Bạn có thể chỉ định số lượng tài liệu cần đọc vào bộ đệm batchSize như bạn đã thực hiện với giá trị 1.

Điều này rất hữu ích khi bạn biết bạn muốn đọc bao nhiêu tài liệu. Khi bạn chỉ cần 10 tài liệu, bạn có thể nhận tất cả các tài liệu đó trong một gói mạng đơn lẻ bằng cách sử dụng batchSize => 10. Khi chỉ định batchSize => 5, sẽ mất nhiều thời gian hơn vì phải mất hai gói mạng đến cơ sở dữ liệu để nhận được 10 tài liệu dự kiến.

Bạn an toàn khi sử dụng mặc định batchSize.

Bạn có thể thử để lặp qua con trỏ sử dụng foreach như trong một ví dụ trong tài liệu: http://php.net/manual/en/class.mongocommandcursor.php

Im không chắc chắn nếu tài liệu php.net được cập nhật với phiên bản mới nhất của trình điều khiển MongoDB.

+0

Cho đến nay tôi không phải lo lắng về việc thiếu dữ liệu kể từ khi tổng hợp trả về tất cả dữ liệu. Tôi hiểu rằng con số batchSize tương tự như "giới hạn" của truy vấn. Cắt là gì nếu tôi cho bạn 101? Trong ví dụ về kết quả của tôi, "tài liệu" sẽ là gì? Cảm ơn! @DanFromGermany – ephramd

+1

@ephramd batchSize không hiển thị với người dùng nhưng có tác động lên mạng và bộ nhớ vì nếu tài liệu của bạn không vừa trong bộ đệm, máy khách sẽ gọi máy chủ như "cung cấp cho tôi 101 tài liệu tiếp theo" không thực sự là một giới hạn bởi vì bạn vẫn nhận được tất cả các tài liệu. – DanFromGermany

1

Giả sử bạn đang sử dụng MongoDB PHP Library mới nhất, bạn sẽ có thể vượt qua tùy chọn 'useCursor' => false (mặc định là true) như được giải thích trong doc.

+0

Cảm ơn bạn đã trả lời nhưng tôi không sử dụng Thư viện PHP MongoDB Tôi sử dụng thư viện không có giao diện và tài liệu này không tương thích với tôi. Tôi sử dụng tham chiếu trong tin nhắn, mặc dù cái này có lỗi không được cập nhật. – ephramd

+0

Tiện ích mà bạn hiện đang sử dụng đã không được chấp nhận (http://php.net/manual/en/mongo.setup.php). Vì vậy, tôi không nghĩ rằng có bất kỳ cách dễ dàng để có nó hỗ trợ phiên bản mới nhất của MongoDB. Tài liệu đề xuất sử dụng [trình điều khiển MongoDB] (http://php.net/manual/en/set.mongodb.php) trong kết hợp với Thư viện PHP MongoDB thay vì –

1

Từ sổ tay MongoDB mới nhất, thao tác tổng hợp đã thay đổi.

aggregate without cursor

MongoDB 3.4 deprecates việc sử dụng các lệnh tổng hợp mà không có sự lựa chọn con trỏ , trừ trường hợp đường ống bao gồm các tùy chọn giải thích. Khi trả về kết quả tổng hợp nội dòng bằng cách sử dụng lệnh tổng hợp, chỉ định tùy chọn con trỏ sử dụng con trỏ kích thước lô mặc định: {} hoặc chỉ định kích thước lô trong con trỏ tùy chọn con trỏ: {batchSize: }.

Bạn chỉ có thể chỉ định tham số đó cho cuộc gọi chức năng của mình bằng cách thêm [ "cursor" => [ "batchSize" => 0 ] ] làm thông số thứ hai sẽ giải quyết vấn đề này. tham khảo here.

Bạn cũng có thể tham khảo SO question này để sử dụng thông số con trỏ.

1

Bạn phải sử dụng aggregateCursor để trả về hàng con trỏ thay vì chỉ results.

Thứ gì đó như

Lô đầu tiên theo mặc định được đặt ở 101 kết quả.

$cur = $this->db->{$collection}->aggregateCursor($pipeline); 

Đặt batchsize (tham số thứ hai từ câu hỏi của bạn) trên con trỏ tổng hợp là 50 cho các đợt tiếp theo. Nếu bạn không sử dụng tùy chọn dưới đây, mặc định sẽ tìm nạp khoảng 4 MB.

$cur->batchSize(50); 

Bây giờ bạn có thể lặp lại và đọc kết quả để nhận tất cả tài liệu.

Máy chủ sẽ tìm nạp lô đầu tiên (đầu tiên) của 101 tài liệu lặp lại vòng lặp đầu tiên tiếp theo là đợt tiếp theo tại 102 lần lặp và khoảng thời gian là 50 cho đến khi bạn xả con trỏ.

foreach ($cur as $result) 
{ 
    echo $result['_id'], "\n"; 
} 

Để kiểm soát kích thước hàng loạt cho lô đầu tiên, bạn có thể chỉ định batchSize làm tùy chọn con trỏ nhưng thường không cần thiết.

$cur = $this->db->{$collection}->aggregateCursor($pipeline, 'cursor' => [ 'batchSize' => 1 ]); 

tham khảo: https://derickrethans.nl/aggregation-cursor.html

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