2011-01-01 5 views
8

모두. 나는 만화를 좋아한다. 그리고 지금 나는 몽고를 너무 좋아한다는 것을 배우고 있습니다 :-)MongoDB : save()를 사용하여 컬렉션의 기존 문서를 업데이트하십시오.

how to use save() to update an existing document in a collection in MongoDB PHP에 대한 설명이 있습니까?

<?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의 예에서 (저장한다는 것입니다) 객체 동안 덮어 :하지만 난 여기에 내 테스트 코드의

> 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의 "현실"에 적용 할 수 없습니다 JS 예제에서이를 업데이트합니다. 나는 JS에서와 같은 PHP에서 재현 할 수 있으면 좋겠다.

미리 감사드립니다. JS의 예에서

+0

http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations에서 x가 _id 필드 (x는 JSON 스타일 객체이고 upsert는 업데이트를 의미 함)가 있으면 upsert가 수행된다고합니다. 누락 된 경우 삽입하십시오). " – Roger

+0

문제가 무엇인지 모르겠다. JS와 PHP 예제가 똑같은 일을하지 않는다? 기대하는 바가 무엇인지 말해주십시오. 우리가 환경을 설정하고 출력물을보기 위해 코드를 실행하기를 기대하지 마십시오. – Theo

+0

답장을 보내 주셔서 감사합니다. php 예제를 실행하면 JS 예제에서 객체를 업데이트하는 동안 save()가 객체를 덮어 씁니다. 나는 JS에서와 같은 PHP에서 재현 할 수 있으면 좋겠다. – Roger

답변

12

이러한 예는 같은 일을하고 있지 ...

당신은 당신이 를 추가 할 수있는 같은 객체를 수정,

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

다음 개체 몽고 선언 종류 ...

> mongo.type = "database"; 

PHP의 예를 들어 당신이이 오렌지에서 다른 객체/문서입니다 두 개체 ...

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

이이 (가) JS 쉘에서 다음을 수행 같은 것 ... 그래서

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

사과를 선언 ... save()을 실행하고 NEW 개체를 전달하면 이전 개체를 완전히 덮어 씁니다.

귀하는 객체를 검색하기 때문에는 괜찮 았는데() 갱신 ... 그런 객체 에 업데이트를 실행

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

; JS의 예에서 ... 그것을 대체 할 새로운 객체를 전달하는 대신

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

을 새 필드를 전달 만 하나의 객체는 그래서 기본적으로 교체하는 대신 업데이트에 그것을 추가했다.

올바른 PHP 코드

PHP는 당신이 JS 쉘에서 뭘하고 있었는지 복제 할 다음 ...

<?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

저스틴, 매우 빛나는 답에 감사드립니다. 나의 예제에서는'$ a'와'$ b'가 실제로는 다른 객체라는 점을 고려하지 않고'save()'가 배열 내용으로 만 공급되고 있다고 생각했습니다. 사실, JS 예제에서 "upsert"이전에 findOne()이있었습니다. 이'findOne()'은'$ filter = array ('_ id'=> 'test_a');에 다음과 같은 내용이 삽입되도록 PHP update()에 나타납니다 : 이 개체에. 마지막 예를 들어 주셔서 감사합니다. 완벽했습니다. – Roger

+0

그리고 나 자신을 되풀이하지 않기 위해서 몽고에게 유일한 '_id'를주었습니다. 왜냐하면 나는 미래의 업데이트를하기 위해 값을 식별하는 쉬운 방법이 필요하기 때문입니다. '_id' 필드를 사용하는 것은 자연스러운 일이었습니다. 그러나, 이것을하지 않는 좋은 이유가 있다면, 나는 행복하게 그것을 다른 분야에 넣고 몽고로 하여금 자신의 길을 결정하게 할 것입니다. 왜'_id' 필드를 사용하지 말 것을 권유합니까? – Roger

+0

좋습니다! 귀하의 질문에 대답한다면 "답"으로 표시하십시오. 그러면 옆에 큰 녹색 체크 표시가 나타납니다! –