Tôi đang thực hiện một số cuộc điều tra tại sao điều này xảy ra. Và tôi không nghĩ rằng tôi có thể tìm ra cách làm thế nào để "sửa chữa" vấn đề này.
JavaScript có sự khác biệt giữa mảng và mảng / đối tượng kết hợp. PHP có sự khác biệt giữa mảng và đối tượng. Đối với PHP, mảng kết hợp là một mảng và đối với JavaScript nó là một đối tượng.
Khi trình điều khiển PHP cần chuyển đổi một mảng thành một đối tượng JSON, nó sẽ cố gắng xác định xem một mảng có phải là một trong hai hay không:một mảng bình thường với các khóa được đánh số tuần tự bắt đầu bằng 0; hoặc một mảng kết hợp. Việc triển khai hiện tại liên quan đến bất kỳ mảng nào có các khóa được đánh số thứ tự, bắt đầu từ 0 một mảng bình thường. Và một mảng bình thường không chứa khóa . Và đây là vấn đề. Trong trường hợp trình điều khiển thấy một mảng bình thường, không có thông tin tên trường nào trong BSON được gửi đến máy chủ và do đó máy chủ không thể cập nhật trường.
Tôi không thể nghĩ ra cách nào để thay đổi hành vi này mà không phá vỡ bất kỳ loại mã hiện có nào. Vì vậy, nếu bạn muốn tên trường dạng số, bạn sẽ phải sử dụng đối tượng stdClass cho "tài liệu chính". Ngoài ra, bạn có thể đẩy các khóa đó vào một tài liệu được nhúng và sau đó cập nhật:
<?php $m = new Mongo; $collection = $m->demo->testcollection; $collection->insert(array( "_id" => 'bug341', 'data' => array( 0, 1, 1, 2, 3, 5 ) )); $obj = $collection->findOne(); $update = array('data.0' => 'zero int'); $collection->update( array( '_id' => 'bug341' ), array( '$set' => $update ) ); $obj = $collection->findOne(); var_dump($obj); ?>