mongodb更新或插入子数组

时间:2012-09-18 00:01:27

标签: php arrays mongodb sub-array

好的,我需要做以下的事情

我将mongo收藏为

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',
        ),

1 个答案:

答案 0 :(得分: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的正确子文档。