Php mongodb更新或插入子数组

Php mongodb更新或插入子数组,php,arrays,mongodb,sub-array,Php,Arrays,Mongodb,Sub Array,好的,我需要做以下事情 我把mongo收集作为 array ( '_id' => new MongoId("50513d8338fc5de706000000"), 'offers' => array ( '0' => array ( 'minspend' => '50.00', 'cashback' => '1.50', 'percentage' => '0.03', ), '

好的,我需要做以下事情

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

)

您可以使用
$set
和点符号来指定要更新的数组元素:

$collection->update(
    array("_id" => new MongoId("50513d8338fc5de706000000")), 
    array("$set" => array("offers.0" => 
        array (
            'minspend' => '50.00',
            'cashback' => '1.50',
            'percentage' => '0.03',
        )
    ))
);
提供。0
指数组中的第0(=第一个)元素。如果要更新第二个,可以使用
offers.1
作为键

对于第二个问题,我假设您希望将MongoId添加到子文档中。您也可以用同样的方法,只需在minspend之前添加
'Offer_id'=>new MongoId(),
。这将创建一个新的唯一MongoId并将其添加到子文档中。如果要添加现有的MongoId,请使用
新MongoId(“…”
,并将
替换为24个十六进制字符的长字符串

如果您已经有一个Offer\u id,并且只想更改与该id匹配的Offer,则可以使用positional$语法:

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

您可以查询具有正确
\u id
的文档,还可以查询
优惠。优惠id
。在命令的更新部分,您可以使用
offers.$
其中,$将自动匹配包含Offer\u id的正确子文档。

如果我有offers.[]。Offer\u id我可以使用它来更新minspend等吗?在这种情况下,在查询中使用Offer\u id作为第二个条件(查询_id和offers.offer_id,并使用$sign作为位置参数。请参见此处位置运算符的工作原理:请您解释一下。通过一个示例,文档确实没有帮助。我已将其添加到上面的代码示例中。我希望这能回答您的问题。