我将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',
),
)
答案 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的正确子文档。