【问题标题】:mongodb update or insert sub-arraymongodb 更新或插入子数组
【发布时间】:2012-09-10 05:26: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',
        ),

)

【问题讨论】:

    标签: php arrays mongodb sub-array


    【解决方案1】:

    您可以将$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 的正确子文档。

    【讨论】:

    • 如果我有优惠。[].offer_id 我可以用它来更新 minspend 等吗?
    • 在这种情况下,使用查询中的 offer_id 作为第二个条件(查询 _id 和 offer.offer_id 并使用 $ 符号作为位置参数。查看位置运算符的工作原理:@987654321 @
    • 您能解释一下吗?举个例子,文档并没有真正的帮助
    • 当然,我已将它添加到上面的代码示例中。我希望这能回答你的问题。
    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多