2013-07-31 51 views
0

我使用Symfony2和DoctrineMongoDB Bundle。我提供了一種以JSON格式(對象)接收信息的服務。學說MongoDB ODM不改變參考對象的狀態

我要發送的對象有一個屬性,用於引用數據庫中不同集合中的另一個對象。

更改參考作品。但是,如果我發送另一個字段,如ObjectB中的「title」,它會將標題設置爲DataBase中的新值。我怎樣才能防止這一點?

我只想設置新的引用,對該對象沒有任何操作。

下面是一些代碼(縮短)

class Fun{  
    /** 
    * @MongoDB\Id(strategy="auto") 
    */ 
    private $id; 

    /** @MongoDB\EmbedMany(targetDocument="JokeEmbedded", strategy="set") 
    */ 
    private $jokes = array(); 

} 


class JokeEmbedded 
{ 
    /** 
    * @MongoDB\ReferenceOne(targetDocument="JokePattern", cascade={"persist"}) 
    */ 
    private $ref; 

    /** 
    * @MongoDB\String 
    */ 
    private $title; 
} 

class JokePattern 
{ 
    /** 
    * @MongoDB\Id(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @MongoDB\String 
    */ 
    private $title; 
} 

現在我發送以下JSON的服務:(JSON代表ObjetClass遊戲)

[{"id":"1","jokes":[{"ref":{"id":"222", "title":"new title"}]] 

我的問題是,現在,怎麼我是否忽略新給定的「標題」作爲我想設置的參考? 我想在數據庫中設置新的引用ID爲222.沒有更多。

任何幫助將是偉大的! 謝謝!

編輯:

這是處理JSON輸入

$request = $this->getRequest(); 
//Get JSON-Data 
$data = $request->getContent(); 
$funs = $this->get('serializer')->deserialize(
    $data, 
    'ArrayCollection<Acme\FunBundle\Document\Fun>', 
    'json' 
); 

//create documentmanager 
$dm = $this->get('doctrine_mongodb')->getManager(); 

foreach ($funs as $obj) { 
     //save to db 
     $dm->persist($obj); 
    } 
$dm->flush(); 
+0

你可以分享採取JSON有效載荷,修改模型和執行'flush()'的實際代碼嗎? JSON不直接匹配文檔結構,所以我們仍然沒有看到您的託管文檔如何被修改。 – jmikola

+0

我修改了我的帖子 – doggy

+0

在你的例子中,它看起來並不像你正在設置一個參考。我不確定你是否使用Symfony組件或[Johannes'](http://jmsyst.com/libs/serializer))庫,但是反序列化正在構造每個類的新對象。 ODM JokePattern會被級聯持久化,並且JokeEmbedded在存儲在Fun文檔中時將只包含一個引用。如果你有一個setter方法,JokeEmbedded上的'$ title'屬性也可能被設置,但我不能說。我建議查看序列化器文檔以排除字段。 – jmikola

回答

0

我與反序列化上下文和JMS SerializerBundle內的列表標註管理它的代碼。

問候:)