2011-01-01 45 views
8

mọi người. Tôi yêu manga. Và bây giờ tôi đang học cách yêu mongo :-)MongoDB: Sử dụng lưu() để cập nhật tài liệu hiện có trong bộ sưu tập

Có giải thích về how to use save() to update an existing document in a collection in MongoDB PHP? nhưng tôi không thể áp dụng nó để "thực tế" của 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"} 

Đây là mã thử nghiệm của tôi:

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

Thực tế là trong ví dụ PHP save() ghi đè các đối tượng trong khi trong ví dụ JS nó cập nhật nó. Tôi ước tôi có thể tái tạo trong PHP giống như trong JS.

Xin cảm ơn trước.

+0

Trong http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations người ta nói rằng "save() thực hiện lệnh upsert nếu x có trường _id (x là một đối tượng kiểu JSON và upsert có nghĩa là cập nhật nếu có; chèn nếu thiếu) ". – Roger

+0

Tôi không thấy vấn đề là gì, không phải ví dụ JS và PHP cũng làm như vậy? Cho chúng tôi biết bạn đang mong đợi điều gì. Đừng mong đợi chúng tôi thiết lập môi trường và chạy mã của bạn chỉ để xem đầu ra. – Theo

+0

Cảm ơn bạn đã trả lời. Nếu bạn chạy ví dụ php, bạn sẽ thấy rằng save() ghi đè lên đối tượng trong khi trong ví dụ JS nó cập nhật nó. Tôi ước tôi có thể tái tạo trong PHP giống như trong JS. – Roger

Trả lời

12

Những ví dụ này không làm điều tương tự ...

Trong ví dụ JS bạn tuyên bố đối tượng Mongo

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

Sau đó, bạn sửa đổi cùng đối tượng thêm loại ...

> mongo.type = "database"; 

Trong PHP Ví dụ, bạn tuyên bố HAI đối tượng ...

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

này sẽ như thế nào làm như sau trong vỏ JS ...

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

Vì vậy táo là một đối tượng khác nhau/tài liệu từ cam ... do đó khi bạn chạy lưu() và vượt qua đối tượng MỚI, nó sẽ ghi đè hoàn toàn đối tượng cũ.

bạn cập nhật() làm việc tốt bởi vì bạn đã tìm kiếm cho các đối tượng ...

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

Sau đó chạy bản cập nhật trên rằng đối tượng; đi qua các lĩnh vực mới thay vì đi qua một đối tượng mới để thay thế nó ...

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

Trong ví dụ JS bạn chỉ có một đối tượng nên về cơ bản gắn nó trên bản cập nhật thay vì thay thế nó.

Đúng PHP Mã

Sau đây PHP sẽ tái tạo những gì bạn đã làm trong vỏ 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>"; 

?> 

Note: tôi muốn mạnh khuyên bạn không đặt đối tượng của riêng bạn _id 's và thay vào đó hãy để người lái xe làm điều đó cho bạn như tôi đã làm trong ví dụ trên.

+0

Justin, cảm ơn bạn đã trả lời rất tuyệt vời. Trong ví dụ của tôi, tôi nghĩ rằng 'save()' chỉ được cho ăn với nội dung mảng, không xem xét rằng '$ a' và' $ b' thực sự là các đối tượng khác nhau. Trong thực tế, trong ví dụ JS, có một 'findOne()' trước "upsert". 'FindOne()' này xuất hiện trong PHP 'update()', như bạn đã nói, trong '$ filter = array ('_ id' => 'test_a');' để bất cứ điều gì đến trong đối số tiếp theo sẽ được chèn vào vào đối tượng này. Cảm ơn bạn cho bạn ví dụ cuối cùng, nó đã được hoàn hảo. – Roger

+0

Và tôi đang nuôi dưỡng Mongo với '_id' duy nhất của mình để không lặp lại bản thân mình, vì tôi cần một cách đơn giản để xác định một giá trị để cập nhật trong tương lai. Tôi chỉ sử dụng trường '_id' là tự nhiên. Tuy nhiên, nếu có lý do chính đáng để không làm điều này, tôi sẽ vui vẻ đặt nó vào một lĩnh vực khác và để Mongo quyết định theo cách riêng của mình. Bạn vui lòng cho tôi biết lý do bạn khuyên bạn không nên sử dụng trường '_id'? – Roger

+0

Tuyệt vời! Nếu tôi trả lời câu hỏi của bạn, vui lòng đánh dấu câu trả lời này là "câu trả lời" để nó có dấu kiểm màu xanh lục bên cạnh nó! –

Các vấn đề liên quan