Mongodb重复密钥更新

时间:2013-06-28 09:43:25

标签: php mongodb

我通过ensureIndex方法创建了集合索引。

我使用update方法进行数据插入,但是我有批量数据插入问题,

我不理解使用“each”键的“push”或“addToSet”。

我需要查询php数组语法。

db.collection.update(
  <query> ( here, how I use the query on bulk insert ? ),
  {
    $addToSet: {
      <field1>: { $each: [ <value1>, <value2> ... ] },
      <field2>: { $each: [ <value1>, <value2> ... ] },
      <field2>: { $each: [ <value1>, <value2> ... ] }
    },
    {$inc : {file_hit : 1}}
  },
  {upsert : true, multi : true}
)

1 个答案:

答案 0 :(得分:1)

$push$addToSet更新运算符都将值附加到数组字段。 $push类似于在PHP中执行$arr[] = $value,因为值始终会附加。 $addToSet只会向数组添加一个值(如果它尚不存在) - 从而将数组视为set

通常,$push$addToSet都需要一个字段值。如果您希望指定多个值,可以使用$each运算符包装那些值,您在上面的代码示例中进行了操作。在MongoDB 2.4之前,您可能已经使用了$pushAll运算符,但此后它已被弃用,而不是$each。每个操作员的链接文档应清楚地解释它们如何相互作用。

如果我们使用MongoCollection::update()

将原始JS示例翻译成PHP
$collection->update(
  [], /* update query */
  [
    '$addToSet' => [
      [ 'field1' => [ '$each' => [ $value1, $value2 ]],
      [ 'field2' => [ '$each' => [ $value3, $value4 ]],
    ],
    '$inc' => [ 'file_hit' => 1 ],
  ],
  [ 'multi' => true ]
);

注意:我正在使用PHP 5.4的短数组语法。早期版本需要使用array()代替[]

我修复了JS示例中的一些错误。首先,我删除了$inc周围的对象,因为更新运算符属于第二个参数的顶层。 $inc应与$addToSet平行。

我还删除了upsert选项,因为它与multi不兼容。从逻辑上讲,upsert决定更新文档(如果存在),否则将其插入。这与多文档更新根本不兼容。 MongoDB的db.collection.update()文档更详细地解释了这两个选项。