2011-08-07 13 views
1

サービスのために配列要素[1]を削除して請求したいと思います。問題は、いつでも他の要素が同じ値を含んでいることです。すべての要素が削除されます。 [1] - [8]および[10] - [15]。私はこれを制限することを試みたが、

の要素識別子は括弧で囲まれていますが、どちらも機能しません。

重複する値がない場合、次のコードは完全に機能します。私は問題なく[1]と[9]を取り除くことができます。

$forward = $_POST['id']; 
$conn = new Mongo('localhost'); 
$db = $conn->pianos; 
$collection = $db->names; 
$criteria = array('_id' => $forward,); 


// Find single document by ID Variable 
$obj = $collection->findOne($criteria); 


// define variables for Array objects 
$service = $obj['service'] [$i]; 
$charge = $obj['charge'] [$i]; 

$serv = array('service' => $service, 'charge' => $charge); 

$upsert = true; 
     $collection->update($obj, array('$pull' => $serv) ,array("upsert" => $upsert));    

PhpMoAdminが提供するドキュメントの構造を以下に示します。

[$_id] => MongoID Object (
    [$id] => 4e3a8a457bfb8b2817000002 
) 

[fname] => Billy Bob 
[lname] => Thornton 

[service] => Array (
[0] => Tune 2 pianos 
[1] => Tuned 
[2] => Tuned 
[3] => Tuned 
[4] => Tuned 
[5] => Tuned 
[6] => Tuned 
[7] => Tuned 
[8] => Tuned 
[9] => Called 
[10] => Tuned 
[11] => Tuned 
[12] => Tuned 
[13] => Tuned 
[14] => Tuned 
[15] => Tuned 
) 
[charged] => Array (
[0] => 100.00 
[1] => 50.00 
[2] => 50.00 
[3] => 50.00 
[4] => 50.00 
[5] => 50.00 
[6] => 50.00 
[7] => 50.00 
[8] => 50.00 
[9] => 0.00 
[10] => 50.00 
[11] => 50.00 
[12] => 50.00 
[13] => 50.00 
[14] => 50.00 
[15] => 50.00 
) 

答えて

2

MongoDBにはこのための修飾子操作がありません。

すべてのエントリにサービス日付を追加して、すべてが一意になるようにすることができます。また、設計の観点からは、サービス名、データ&の料金(および後で追加するもの)を含む配列サブ文書を格納する方が良いでしょう。

現在の「スキーマ」では、ドキュメント全体を取得してクライアント側で修正して書き戻すことしかできません。これはアトミックではありませんので、特定の時間にドキュメントを変更できるユーザーが1人だけであることを確認してください。