2011-01-01 17 views
8

सभी को। मुझे मंगा पसंद है। और अब मैं भी मोंगो से प्यार करना सीख रहा हूं :-)MongoDB: किसी संग्रह में मौजूदा दस्तावेज़ को अद्यतन करने के लिए सहेजें() का उपयोग करें

how to use save() to update an existing document in a collection in MongoDB PHP का स्पष्टीकरण है? लेकिन मैं यहाँ अपने परीक्षण कोड है PHP के "वास्तविकता" में इसे लागू नहीं कर सकता है :-)

> var mongo = db.things.findOne({name:"mongo"}); 
> print(tojson(mongo)); 
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo"} 
> mongo.type = "database"; 
database 
> db.things.save(mongo); 
> db.things.findOne({name:"mongo"}); 
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database"} 

:

<?php 
$a=array('_id'=>'test_a','field1'=>'anything'); 
$b=array('_id'=>'test_a','field2'=>'anything else'); 

$m=new Mongo(); 
$c=$m->db->test; 
$c->save($a); 
$c->save($b);//overwrites the previous record 

/* 
//With update() it works fine 
$filter=array('_id'=>'test_a'); 
$update=array('$set'=>array('field2'=>'anything else')); 
$c->update($filter,$update); 
//$c->save($filter,$update);//Also tried... 
*/ 

$f=$c->find(); 
echo $f->count()." found \n"; 
$i=iterator_to_array($f);//mongo cursos iterator 
$m->close();//disconnect mongo 

print_r($i); 
?> 

तथ्य यह है कि पीएचपी उदाहरण में बचाने के (है) द्वारा ओवरराइट कर दिया वस्तु, जबकि जेएस उदाहरण में यह अद्यतन करता है। काश मैं जेएस में समान PHP में पुन: पेश कर सकता हूं।

अग्रिम धन्यवाद।

+0

http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations में यह कहा गया है कि "सहेजें() एक अपरिवर्तित करता है यदि x में _id फ़ील्ड है (x कुछ JSON शैली ऑब्जेक्ट और अपरर्ट का मतलब है अद्यतन यदि मौजूद है; लापता होने पर डालें) "। – Roger

+0

मुझे नहीं पता कि समस्या क्या है, क्या जेएस और PHP उदाहरण एक ही काम नहीं करते हैं? हमें बताएं कि आप क्या उम्मीद कर रहे हैं। आउटपुट देखने के लिए हमें पर्यावरण स्थापित करने और अपना कोड चलाने की उम्मीद न करें। – Theo

+0

उत्तर के लिए धन्यवाद। यदि आप php उदाहरण चलाते हैं, तो आप देखेंगे कि सहेजने() जेएस उदाहरण में ऑब्जेक्ट को ओवरराइट करता है, यह इसे अपडेट करता है। काश मैं जेएस में समान PHP में पुन: पेश कर सकता हूं। – Roger

उत्तर

12

ये उदाहरण एक ही बात नहीं कर रहे हैं ...

जे एस उदाहरणों में आप

> var mongo = db.things.findOne({name:"mongo"}); 

फिर वस्तु मोंगो घोषित, आप हीजोड़ने के लिए वस्तु संशोधित टाइप करें ...

> mongo.type = "database"; 

में पीएचपी उदाहरण आप दो वस्तुओं ...

$a=array('_id'=>'test_a','field1'=>'anything'); 
$b=array('_id'=>'test_a','field2'=>'anything else'); 

यह जे एस खोल में निम्न कार्य जैसा होगा ...

> var apples = db.things.findOne({name:"mongo"}); 
> var orange = db.things.findOne({type:"database"}); 

तो सेब घोषितसंतरे से एक अलग वस्तु/दस्तावेज है ... इसलिए जब आप बचाते हैं() और नई ऑब्जेक्ट को पास करते हैं तो यह पुरानी ऑब्जेक्ट को पूरी तरह से ओवरराइट करता है।

आपका अद्यतन() ठीक काम किया है क्योंकि आप वस्तु के लिए खोज की ...

$filter=array('_id'=>'test_a'); 

फिर कि वस्तु पर अद्यतन भाग गया; एक नई वस्तु गुजर इसे बदलना के बजाय नए क्षेत्र से गुजर रहा ...

$update=array('$set'=>array('field2'=>'anything else')); 
$c->update($filter,$update); 

जे एस उदाहरणों में आप केवल एक वस्तु तो यह मूल रूप में यह अद्यतन पर बजाय संलग्न जगह के लिए किया था।

सही पीएचपी कोड

निम्नलिखित पीएचपी दोहराने क्या आप जे एस खोल में क्या कर रहे थे ...

<?php 

$connection = new Mongo(); 
$db = $connection->foo; 
$collection = $db->testing; 

// create new object & save 
$a = array('color'=>'red'); 
$collection->save($a); 

// add type = fruit to existing object & save 
$a['type'] = 'fruit'; 
$collection->save($a); 

// print out results. 
echo "<pre>"; 
var_dump($collection->findOne(array("color" => "red"))); 
echo "</pre>"; 

?> 

नोट: मैं चाहते दृढ़ता से सुझाव है कि आप अपने खुद के वस्तु _ id 'रों निर्धारित नहीं करते हैं और बदले में चालक यह तुम्हारे लिए क्या के रूप में मैं ऊपर के उदाहरण में किया करते हैं।

+0

जस्टिन, आपके लिए बहुत ही शानदार उत्तर के लिए धन्यवाद। मेरे उदाहरण में मैंने सोचा था कि 'सेव() 'केवल सरणी सामग्री के साथ खिलाया जा रहा था, इस पर विचार नहीं कि' $ ए' और '$ बी' वास्तव में अलग-अलग वस्तुएं थीं। वास्तव में, जेएस उदाहरण में, "अप्सर्ट" से पहले 'findOne()' था। यह 'findOne()' PHP 'अपडेट() 'में दिखाई देता है, जैसा कि आपने कहा है,' $ filter = array (' _ id '=>' test_a ') में;' ताकि जो भी अगले तर्क में आता है उसे डाला जाएगा इस वस्तु में। आपके लिए अंतिम उदाहरण के लिए धन्यवाद, यह सही था। – Roger

+0

और मैं खुद को दोहराने के क्रम में मोंगो को अपने एकमात्र '_id' के साथ खिला रहा हूं, क्योंकि भविष्य में अपडेट करने के लिए मुझे मूल्य की पहचान करने का एक आसान तरीका चाहिए। '_id' फ़ील्ड का उपयोग करना मेरे लिए स्वाभाविक था। हालांकि, अगर ऐसा करने का कोई अच्छा कारण नहीं है, तो मैं खुशी से इसे दूसरे क्षेत्र में रखूंगा और मोंगो को अपना रास्ता तय करने दूंगा। क्या आप कृपया मुझे बताएं कि आप '_id' फ़ील्ड का उपयोग न करने की सलाह क्यों देते हैं? – Roger

+0

बढ़िया! अगर मैंने आपके प्रश्न का उत्तर दिया तो कृपया इसे "उत्तर" के रूप में चिह्नित करें ताकि उसके पास बड़ा हरा चेक मार्क हो! –

संबंधित मुद्दे

 संबंधित मुद्दे