Php/docs/mongocollection.insert
MongoCollection::insert
(PECL mongo >=0.9.0)
MongoCollection::insert — 插入文档到集合中
说明
public MongoCollection::insert
( array|object $a
[, array $options
= array()
] ) : bool|array
发送到数据库的所有字符串必须是 UTF-8 的。如果有字符串不是 UTF-8,将会抛出 MongoException 异常。 要插入(或者查询)一个非 UTF-8 的字符串,请使用 MongoBinData。
参数
a
一个数组或对象。如果使用的是一个对象,它不能有 protected 或 private 的属性。
Note:
如果参数不具有
_id
键或属性, 将会创建一个新的 MongoId 实例,并赋值给它。 这种特殊行为不意味着参数是传引用的。options
插入的选项。
"fsync"
Boolean, defaults to
false
. If journaling is enabled, it works exactly like"j"
. If journaling is not enabled, the write operation blocks until it is synced to database files on disk. Iftrue
, an acknowledged insert is implied and this option will override setting"w"
to0
.Note: If journaling is enabled, users are strongly encouraged to use the
"j"
option instead of"fsync"
. Do not use"fsync"
and"j"
simultaneously, as that will result in an error."j"
Boolean, defaults to
false
. Forces the write operation to block until it is synced to the journal on disk. Iftrue
, an acknowledged write is implied and this option will override setting"w"
to0
.Note: If this option is used and journaling is disabled, MongoDB 2.6+ will raise an error and the write will fail; older server versions will simply ignore the option.
"w"
See Write Concerns. The default value for MongoClient is
1
."wtimeout"
Deprecated alias for
"wTimeoutMS"
."safe"
Deprecated. Please use the write concern
"w"
option."timeout"
Deprecated alias for
"socketTimeoutMS"
.
返回值
如果设置了 "w"
选项,将会返回包含插入状态的数组。
否则,将会返回一个 true
代表数组不是空的(空数组将会抛出 MongoException )。
如果返回了一个 array,将会有以下键:
ok
- 它应该几乎总是 1(除非 last_error 本身出现错误)。
err
- 如果这个字段不是 null,说明刚才的操作出现了错误。 如果有这个字段,它将包含一个字符串,用于描述出现的错误信息。
code
- 如果发生了一个数据库错误,相应的错误码会传到客户端。
errmsg
- 如果数据库命令出现了错误,将会设置这个字段。同时
ok
也会是 0. 例如,设置了w
并且超时了,errmsg 将会是 "timed out waiting for slaves" 并且ok
是 0。 如果设置了这个字段,它会是发生的错误的字符串描述。 n
- 如果最后的操作是插入、更新或删除,将会返回受影响的对象数量。对于插入操作,这个值总是
0
。 wtimeout
- 等待复制直到超时的时间。
waited
- 在超时前,要等待操作多久。
wtime
- 如果设置了
w
并且操作成功了,等到复制到w
台服务器的时间。 upserted
- 如果发生了一次 upsert,这个字段将会包含新记录的
_id
。 对于 upsert,不管是该字段还是updatedExisting
都会被保留(除非发生了一个错误)。 updatedExisting
- 如果一个 upsert 更新了一个存在的元素,这个字段将会是 true。 对于 upsert,无论是这个字段 还是 upserted 都会被保留(除非发生了错误)。
错误/异常
如果插入的文档是空的,或者包含零长度的键,将会抛出 MongoException。 尝试插入包含 protected 和 private 属性的对象将会导致零长度键(zero-length key)的错误。
Throws MongoCursorException if the "w"
option is set and the write fails.
Throws MongoCursorTimeoutException if the "w"
option is set to a value greater than one and the operation takes longer than MongoCursor::$timeout
milliseconds to complete. This does not kill the operation on the server, it is a client-side timeout. The operation in MongoCollection::$wtimeout
is milliseconds.
更新日志
版本 | 说明 |
---|---|
1.3.0 | options 参数不再接受 boolean 来标识一个确认的写入。
现在,你可以通过
|
1.2.0 | 增加了 "timeout" 选项。
|
1.0.11 | 如果设置了 "safe" ,出现 "not master" 错误时断开连接。
|
1.0.9 |
增加 如果设置了 |
1.0.5 | 修改第二个参数为选项数组。在 1.0.5 之前,第二个参数是 boolean,指示 "safe" 选项。
|
1.0.1 | 如果设置了 "safe" 选项并且插入失败了,将会抛出 MongoCursorException。
|
范例
Example #1 MongoCollection::insert() _id
例子
如果没有 _id
,则会添加一个到插入的文档中。
基于参数传入的方式,在调用代码时可能无法产生有效
_id
。
<?php$m = new MongoClient();$collection = $m->selectCollection('test', 'phpmanual');// 如果使用的是 array 字面语法,将无法成功生成 _id$collection->insert(array('x' => 1));// 通过传 array 的变量可以生成 _id$a = array('x' => 2);$collection->insert($a);var_dump($a);// 通过传引用的 array 无法生成 _id$b = array('x' => 3);$ref = &$b;$collection->insert($ref);var_dump($ref);// 没有在包裹的函数中触发 copy-on-write 时 _id 有效function insert_no_cow($collection, $document){ $collection->insert($document);}$c = array('x' => 4);insert_no_cow($collection, $c);var_dump($c);// 在包裹的函数中触发 copy-on-write 时 _id 无效function insert_cow($collection, $document){ $document['y'] = 1; $collection->insert($document);}$d = array('x' => 5);insert_cow($collection, $d);var_dump($d);?>
以上例程的输出类似于:
array(2) { ["x"]=> int(2) ["_id"]=> object(MongoId)#4 (0) { } } array(1) { ["x"]=> int(3) } array(2) { ["x"]=> int(4) ["_id"]=> object(MongoId)#5 (0) { } } array(1) { ["x"]=> int(5) }
Example #2 MongoCollection::insert() 确认写入的例子
这个例子显示了设置了 w
后,插入两个具有相同 _id 的元素时,导致抛出 MongoCursorException 的例子。
<?php$person = array("name" => "Joe", "age" => 20);$collection->insert($person);// 现在 $person 具有一个 _id 字段,所以我们再次 // 保存它的时候,将会得到一个异常try { $collection->insert($person, array("w" => 1));} catch(MongoCursorException $e) { echo "Can't save the same person twice!\n";}?>
参见
- MongoCollection::batchInsert() - Inserts multiple documents into this collection
- MongoCollection::update() - Update records based on a given criteria
- MongoCollection::find() - 查询该集合,并返回结果集的 MongoCursor
- MongoCollection::remove() - 从集合中删除记录
- MongoDB » insert 的核心文档。