2012-02-15 23 views
12

मैं PHP पीईसीएल एक्सटेंशन का उपयोग करके मोंगोडीबी के साथ प्रयोग कर रहा हूं, हालांकि मुझे काम करने के लिए एक निश्चित अद्यतन क्वेरी प्राप्त करने में कठिनाई हो रही है। मैंने थोड़ी किस्मत के साथ उत्तर के लिए एसओ पर चारों ओर खोज की है।

$m = new Mongo; 
$collection = $m->testdb->testcollection; 

$collection->insert(array(
    0, 1, 1, 2, 3, 5 
)); 

findOne और var_dump रिकॉर्ड इस प्रकार दिखाई देता है का उपयोग करना::

array 
    '_id' => 
    object(MongoId)[6] 
     public '$id' => string '4f3bde65a1f7a0315b000000' (length=24) 
    0 => int 0 
    1 => int 1 
    2 => int 1 
    3 => int 2 
    4 => int 3 
    5 => int 5 

समस्या आता है जब मैं $set का उपयोग कर अद्यतन करना चाहते

मैं एक बुनियादी संग्रह बनाया है। मैं मानचित्रण पीएचपी के मैनुअल में SQL to Mongo Cheat Sheet के नीचे की ओर से पता चला

यहाँ मैं मूल्य क्षेत्र 0 अपडेट करना चाहते हैं पर अपनी क्वेरी आधारित हूँ 100

$obj = $collection->findOne(); 

$collection->update(
    array('_id' => $obj['_id']), 
    array('$set' => array(0 => 100)) 
); 

पुन: प्राप्त करने में कठिनाई रिकॉर्ड से पता चलता है कि यह अवशेष अपरिवर्तित

अगर मैंने कुछ _id के साथ गलत तथापि निम्नलिखित अद्यतन क्वेरी काम करता है कर रहा था,, एक नया मान के साथ पूरे रिकार्ड की जगह यद्यपि, बस नहीं एक क्षेत्र को अद्यतन करने मैं आश्चर्य था।

$collection->update(
    array('_id' => $obj['_id']), 
    array(0 => 100) 
); 

वस्तु डंप:

array 
    '_id' => 
    object(MongoId)[7] 
     public '$id' => string '4f3bde65a1f7a0315b000000' (length=24) 
    0 => int 100 

किसी मैं गलत क्या कर रहा हूँ, और कैसे ठीक $set उपयोग करने के लिए बाहर बिंदु कृपया कर सकते हैं। मुझे यकीन है कि यह स्पष्ट है और मुझे बस उस पर दूसरी आंखों की जरूरत है।

बहुत धन्यवाद।

+0

काम करता है? –

+0

@yi_H: वह ** ** काम करता है। फ़ील्ड '1' अपडेट किया गया है, यह फ़ील्ड' 0' के लिए क्यों काम नहीं करता है? – Leigh

उत्तर

11

मैं क्यों ऐसा होता है करने के लिए कुछ जांच कर रही है। और मुझे नहीं लगता कि मैं इस मुद्दे को "ठीक करने" के तरीके पर एक तरीका ढूंढ सकता हूं।

जावास्क्रिप्ट सरणियों और साहचर्य सरणियों/वस्तुओं के बीच एक अंतर है। PHP में सरणी और वस्तुओं के बीच अंतर है। PHP के लिए एक सहयोगी सरणी एक सरणी है, और जावास्क्रिप्ट के लिए यह एक वस्तु है।

पीएचपी चालक की जरूरत है जब एक JSON ऑब्जेक्ट के लिए एक सरणी परिवर्तित करने के लिए, यह पता एक सरणी है कि क्या लगाने की कोशिश करता है या तो: क्रमिक रूप से गिने 0 से आरंभ कुंजी के साथ एक सामान्य सरणी; या एक सहयोगी सरणी। वर्तमान कार्यान्वयन अनुक्रमिक रूप से क्रमांकित कुंजी के साथ किसी भी सरणी को 0 सामान्य सरणी से शुरू करता है। और एक सामान्य सरणी में कुंजी नहीं है। और यह समस्या है। स्थिति में ड्राइवर सामान्य सरणी देखता है, बीएसओएन में कोई फ़ील्ड नाम जानकारी नहीं है जो सर्वर को भेजती है, और इसलिए सर्वर किसी फ़ील्ड को अपडेट नहीं कर सकता है।

मैं एक तरह से मौजूदा कोड किसी भी प्रकार को तोड़ने के बिना इस व्यवहार को बदलने के बारे में सोच नहीं कर सकते। तो यदि आप संख्यात्मक फ़ील्ड नाम चाहते हैं, तो आपको "मुख्य दस्तावेज़" के लिए stdClass ऑब्जेक्ट का उपयोग करना होगा। वैकल्पिक रूप से, आप एक एम्बेडेड दस्तावेज़ में उन कुंजियों को धक्का और फिर अद्यतन सकता है: `सरणी ('$ सेट' => सरणी (1 => 100))`:

 
<?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); 
?> 
0

आप mongodb में मान्य फ़ील्ड नाम के रूप में किसी संख्या का उपयोग नहीं कर सकते हैं। कोट्स में अपना क्षेत्र "0" डालने का प्रयास करें, इस तरह यह वास्तविकता में लागू किया गया है।

+0

'सरणी ('$ सेट' => सरणी ('0' => 100)) 'का एक ही परिणाम है, फ़ील्ड' 0' अपडेट नहीं है। – Leigh

+2

php सरणी कुंजी तार रहे हैं ... –

9

nnythm से yi_H और जवाब से विभिन्न परीक्षणों, टिप्पणी के आधार पर प्रदर्शन करने के बाद मैं निम्नलिखित मिल गया है।

सभी मामलों में मैं इस आम कोड का उपयोग कर रहा:

$collection->update(
    array('_id' => $obj['_id']), 
    array('$set' => $updateObj) 
); 

निम्नलिखित बिल्कुल काम नहीं है:

  • $updateObj = array(0 => 100);
  • $updateObj = array('0' => 100);

ये काम करते हैं:

  • $updateObj = array(1 => 100);
  • $updateObj = array('1' => 100);

googling और मोंगो पीएचपी डॉक्स के कुछ पढ़ने का एक सा के बाद, मैं मैं सरणियों के बजाय वस्तुओं का उपयोग कर सकते पाया। तो मैंने यह कोशिश की:

$updateObj = new stdClass; 
$updateObj->{0} = 100; 

यह काम करता है!

लेकिन मैं क्यों पता लगाने के लिए नहीं कर पाए हैं ...

संपादित करें:

मोंगो विस्तार स्रोत कोड

MongoCollection->update विधि निम्नलिखित प्रदर्शन के माध्यम से Poking, buf है पहले से ही एक सूचक और newobj एक zval (क्वेरी का दूसरा पैरामीटर) है। HASH_P एन्कोडिंग के लिए ज़वाल की सही संपत्ति देता है, यह इस पर निर्भर करता है कि यह एक सरणी या वस्तु है या नहीं।

zval_to_bson(buf, HASH_P(newobj), NO_PREP TSRMLS_CC) 

bson_encode फ़ंक्शन कार्यक्षमता के संदर्भ में निम्न, समान कार्य करता है। buf सूचक और zval z।

zval_to_bson(&buf, HASH_P(z), 0 TSRMLS_CC); 

तो मैंने निम्नलिखित परीक्षण किया।

$updateObj = new stdClass; 
$updateObj->{0} = 100; 

$one = bson_encode($updateObj); 

$updateObj = array(0 => 100); 

$two = bson_encode($updateObj); 

var_dump($one === $two); 

उत्पादन true

एक नुकसान क्यों 0 एक सरणी में एक फ़ील्ड नाम के लिए काम नहीं कर रहा पर

फिर भी है।

संपादित करें 2:

एक और प्रयोग से पता चलता है कि जब 0 के नाम के साथ एक क्षेत्र (सरणी केवल, वस्तु ठीक है) अद्यतन में शामिल है कोई अद्यतन किसी भी खेतों पर प्रदर्शन कर रहे हैं

उदाहरण:

$updateObj = array(
    '1' => 200 
); 

काम करता है, क्षेत्र 1 अद्यतन किया जाता है।

$updateObj = array(
    '0' => 100, 
    '1' => 200 
); 

नहीं काम है, न तो क्षेत्र 0 या 1 अपडेट किया जाता है।

मुझे लगता है कि मैं एक बग रिपोर्ट प्रस्तुत करने के लिए जा रहा हूँ।

+0

निश्चित रूप से एक बग की तरह लग रहा है - अगर आप पीएचपी ड्राइवर (https://jira.mongodb.org/browse/PHP) विस्तार के प्रकार के साथ आप के लिए प्रस्तुत ऊपर मुझे यकीन है कि क्रिस्टीना एंड कंपनी किसी भी समय एक फिक्स खटखटाएगा :) –

+0

@AdamC: Argh, उनके पास अपना स्वयं का मुद्दा ट्रैकर है। मैंने पहले से ही पीईसीएल पैकेज [PHP बग्स] [https://bugs.php.net/bug.php?id=61103) के लिए एक रिपोर्ट सबमिट की है, मुझे इन चीजों को डुप्लिकेट करने से नफरत है, लेकिन उनकी खुद की प्रणाली बहुत अधिक सक्रिय प्रतीत होती है । – Leigh

+0

हाँ - सभी आधिकारिक रूप से समर्थित ड्राइवरों को जिओ में MongoDB.org साइट पर अपना स्वयं का ट्रैकर है। यदि आपको पैकेज बग पर कोई कर्षण नहीं मिलता है, तो बस वहां एक खोलें और पैकेज बग का संदर्भ लें। ओह, और यहां विस्तार दिया गया है, इस प्रश्न/उत्तर से लिंक करने का बुरा विचार नहीं है :) –

-1
we can update record in mongo db using php example below:- 

$m = new MongoClient(); 
    echo "Connection to database successfully"; 
    $db = $m->unified; 
     $collection = $db->profile; 

$document = array( 
        "name" => $_REQUEST['name'], 
        "email" => $_REQUEST['email'], 
        "age" => $_REQUEST['age'], 
        "address" => $_REQUEST['address'], 
        "comment"=> $_REQUEST['comment'] 

       ); 

       // print_r($document); die; 
      //echo $_REQUEST['pfid']; 
      $filter=array('_id'=>new MongoID($_REQUEST['pfid'])); 
      $update=array('$set'=>$document); 
    $collection->update($filter, $update); 
संबंधित मुद्दे