2011-12-23 10 views
1

DBRefを自分自身で作成するにはどうすればよいですか?たとえば、私は顧客テーブルにUIDフィールドを持っていますが、注文テーブルにこのUIDフィールドもあります。これは、このリクエストが属する顧客を参照するためのもので、うまくいきません。NoSQL、DBRefs:MongoDB

> db.customers.findOne(); 
{ 
     "_id" : ObjectId("4ef4a61a90eec3e3c748263c"), 
     "uid" : 1, 
     "name" : "Andrey", 
     "lastname" : "Knupp Vital" 
} 
> db.orders.findOne(); 
{ 
     "_id" : ObjectId("4ef4a66490eec3e3c748263d"), 
     "oid" : 1, 
     "uid" : 1, 
     "price" : "149.90" 
} 
> db.orders.remove(); 
> order = { oid : 1 , price : 149.90 , uid : new DBRef ('customers' , 1) } ; 
{ 
     "oid" : 1, 
     "price" : 149.9, 
     "uid" : { 
       "$ref" : "customers", 
       "$id" : 1 
     } 
} 
> db.orders.save (order) ; 
> order.uid.fetch(); 
null 
> order.uid 
{ "$ref" : "customers", "$id" : 1 } 
> 

答えて

3

DBRef $ id値は、常に参照されるドキュメントの_idフィールドの値に設定する必要があります。あなたはあなたの例でそれをしていません。修正されたバージョン:

> db.customers.findOne() 
{ 
     "_id" : ObjectId("4ef4a61a90eec3e3c748263c"), 
     "uid" : 1, 
     "name" : "Andrey", 
     "lastname" : "Knupp Vital" 
} 
> db.orders.findOne() 
{ 
     "_id" : ObjectId("4ef4a66490eec3e3c748263d"), 
     "oid" : 1, 
     "uid" : 1, 
     "price" : "149.90" 
} 
> db.orders.remove() 
> order = { oid : 1 , price : 149.90 , uid : new DBRef ('customers' , ObjectId("4ef4a61a90eec3e3c748263c")) } ; 
{ 
     "oid" : 1, 
     "price" : 149.9, 
     "uid" : { 
       "$ref" : "customers", 
       "$id" : ObjectId("4ef4a61a90eec3e3c748263c") 
     } 
} 
> db.orders.save(order) 
> order.uid.fetch() 
{ 
     "_id" : ObjectId("4ef4a61a90eec3e3c748263c"), 
     "uid" : 1, 
     "name" : "Andrey", 
     "lastname" : "Knupp Vital" 
} 
+0

廃止予定ではありません。 – arivero

+0

@ariveroそうかもしれません。この回答はほぼ2歳です;)DBRefが特に実用的なユースケースにはまだ触れていませんが、単純な_id値を使用します。 –

2

私は手動で行います。余分な識別子フィールドを持つと、結局のところ問題が発生する可能性があります。あなたの注文書では、 'customer_id'フィールドを作成し、それを顧客の_idに設定します。これは、リレーショナルリファレンスを使用してSQL外部キーを作成するようなものです。私はこのようなPHPでそれを行います:

$customer = $this->mongo->db->customer->findOne(array("name" => $customer_name)); 
$customer_id = new MongoID($customer['_id']); 
$order = Array(
      'customer_id' => $customer_id, 
     ... 
     ); 

$this->mongo->db->order->insert($order);