2011-12-23 7 views
1

Comment créer un DBRef en fonction d'un champ donné par moi-même? Par exemple, j'ai le champ UID dans la table client, et j'ai aussi ce champ UID dans la table des commandes, qui servira à référencer le client auquel cette requête appartient, ça ne fonctionne pas très bien, voir: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 } 
> 

Répondre

3

La valeur DBRef $ id doit toujours être définie à la valeur du champ _id du document référencé. Vous ne faites pas cela dans votre exemple. Version corrigée:

> 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

N'est pas obsolète, .fetch() ?? – arivero

+0

@arivero Peut-être. Cette réponse date de presque 2 ans;) Je n'ai pas encore rencontré de cas d'utilisation où DBRefs est particulièrement pratique, donc je m'en tiendrai aux simples valeurs _id. –

2

Je le fais manuellement. Avoir un champ d'identifiant supplémentaire finira probablement par causer des problèmes sur la route. Dans vos documents de commande, créez un champ "customer_id" et définissez-le sur le _id du client. C'est comme créer une clé étrangère SQL avec la référence relationnelle. Je le fais en PHP comme ceci:

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