NoSQL, DBRefs: MongoDB - PullRequest
       16

NoSQL, DBRefs: MongoDB

1 голос
/ 23 декабря 2011

Как я могу самостоятельно создать DBRef в соответствии с заданным полем? Например, у меня есть поле UID в таблице клиентов, и у меня также есть это поле UID в таблице заказов, которое будет служить для ссылки на клиента, которому принадлежит этот запрос, просто оно работает не очень хорошо, см .:

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

Ответы [ 2 ]

3 голосов
/ 23 декабря 2011

Значение 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"
}
2 голосов
/ 23 декабря 2011

Я делаю это вручную. Наличие дополнительного поля идентификатора, скорее всего, приведет к возникновению проблем в будущем. В документах заказа создайте поле 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);
...