我通过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}
)
答案 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()文档更详细地解释了这两个选项。