mongodb 更新或插入子数组

Posted

技术标签:

【中文标题】mongodb 更新或插入子数组【英文标题】:mongodb update or insert sub-array 【发布时间】: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',
        ),

)

【问题讨论】:

【参考方案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 @ 您能解释一下吗?举个例子,文档并没有真正的帮助 当然,我已将它添加到上面的代码示例中。我希望这能回答你的问题。

以上是关于mongodb 更新或插入子数组的主要内容,如果未能解决你的问题,请参考以下文章

子数组中的 MongoDB 更新查询

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

使用 Node.js 将数组插入 MongoDB 子文档

Mongodb怎样更新像这样的文档,数组里面有子文档

MongoDB:删除文档后更新子文档数组

如何使用子文档数组更新 MongoDB 文档