मैं कुछ जांच कर रहा हूं कि ऐसा क्यों होता है। और मुझे नहीं लगता कि मुझे इस मुद्दे को "ठीक" करने का कोई तरीका मिल सकता है।
जावास्क्रिप्ट में सरणियों और सहयोगी सरणियों/वस्तुओं के बीच अंतर है। PHP में सरणियों और वस्तुओं के बीच अंतर है। PHP के लिए एक सहयोगी सरणी एक सरणी है, और जावास्क्रिप्ट के लिए यह एक वस्तु है।
जब PHP ड्राइवर को किसी सरणी को JSON ऑब्जेक्ट में बदलने की आवश्यकता होती है, तो यह यह पता लगाने की कोशिश करता है कि क्या कोई सरणी या तो है:0 से शुरू होने वाली क्रमिक रूप से क्रमांकित कुंजियों वाला एक सामान्य सरणी; या एक सहयोगी सरणी। वर्तमान कार्यान्वयन किसी भी सरणी को क्रमिक रूप से क्रमांकित कुंजियों के साथ मानता है, 0 से एक सामान्य सरणी से शुरू होता है। और एक सामान्य सरणी में कुंजी नहीं होती है . और यही समस्या है। उस स्थिति में जब ड्राइवर को एक सामान्य सरणी दिखाई देती है, सर्वर को भेजी जाने वाली बीएसओएन में कोई फ़ील्ड नाम जानकारी नहीं होती है, और इसलिए सर्वर किसी फ़ील्ड को अपडेट नहीं कर सकता है।
मैं किसी भी प्रकार के मौजूदा कोड को तोड़े बिना इस व्यवहार को बदलने के तरीके के बारे में नहीं सोच सकता। इसलिए यदि आप संख्यात्मक फ़ील्डनाम चाहते हैं, तो आपको "मुख्य दस्तावेज़" के लिए एक stdClass ऑब्जेक्ट का उपयोग करना होगा। वैकल्पिक रूप से, आप उन कुंजियों को एक एम्बेडेड दस्तावेज़ में धकेल सकते हैं और फिर अपडेट कर सकते हैं:
<?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); ?>