-2

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

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

我不明白这个“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}
)
4

1 回答 1

1

和更新运算符都将值附加$push$addToSet数组字段。$push类似于$arr[] = $value在 PHP 中做的,因为值总是附加的。$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()文档更详细地解释了这两个选项。

于 2013-06-28T20:20:27.320 回答