2012-09-18 76 views
3

好,我需要離開做以下MongoDB的更新或插入子陣列

我有蒙戈收集儘可能

array (
    '_id' => new MongoId("50513d8338fc5de706000000"), 
    'offers' => 
    array (
    '0' => 
    array (
     'minspend' => '50.00', 
     'cashback' => '1.50', 
     'percentage' => '0.03', 
    ), 
    '1' => 
    array (
     'minspend' => '100.00', 
     'cashback' => '3.00', 
     'percentage' => '0.03', 
    ), 
), 
    'percentageTotal' => '0.06', 
    'test' => new MongoInt32(1), 
) 

,但可以說,我只想更新這部分

array (
     '0' => 
     array (
      'minspend' => '50.00', 
      'cashback' => '1.50', 
      'percentage' => '0.03', 
     ), 

什麼是最好的方式來改變那部分子數組而不重新創建數組中的整個數據。

,並有可能做這樣的事情

array (
     '0' => 
     array (
'Offer_id'=> new MongoId(5715671561715), 
      'minspend' => '50.00', 
      'cashback' => '1.50', 
      'percentage' => '0.03', 
     ), 

回答

4

可以一起使用$set用點符號來指定要更新的數組,其中的元素:

$collection->update(
    array("_id" => new MongoId("50513d8338fc5de706000000")), 
    array("$set" => array("offers.0" => 
     array (
      'minspend' => '50.00', 
      'cashback' => '1.50', 
      'percentage' => '0.03', 
     ) 
    )) 
); 

offers.0指數組中的第0個(=第一個)元素。如果你想更新第二個,你可以使用offers.1作爲關鍵。

對於第二個問題,我假設你想將MongoId添加到子文檔中。你可以用同樣的方法做到這一點,只需在minspend之前添加'Offer_id' => new MongoId(),即可。這將創建一個新的獨特的MongoId並將其添加到子文檔中。如果您想要添加現有的MongoId,請使用new MongoId("...")並用24位十六進制字符長字符串替換...

如果你已經有一個Offer_id並只希望更改該ID匹配的報價,你可以使用位置$語法:

$collection->update(
    array("_id" => new MongoId("50513d8338fc5de706000000"), 
      "offers.Offer_id" => new MongoId("5059637720dfeda164ec0fe7")), 

    array("$set" => array("offers.$" => 
     array (
      'minspend' => '50.00', 
      'cashback' => '1.50', 
      'percentage' => '0.03', 
     ) 
    )) 
); 

你用正確的_id和另外的查詢文檔offers.Offer_id。在命令的更新部分,您使用offers.$,其中$將自動匹配包含Offer_id的正確子文檔。

+0

如果我有offer。[]。offer_id我可以使用它來更新minspend等? – RussellHarrower

+0

在這種情況下,請在查詢中使用offer_id作爲第二個條件(查詢_id和offers.offer_id並使用$符號作爲位置參數。請參見位置運算符的工作原理:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator – Thomas

+0

能否請你解釋一下這個問題?舉個例子,這些文檔確實沒有幫助 – RussellHarrower