为什么mongodb会为数组元素自动添加键


why mongodb auto add key for a array element?

下面的代码将插入一个文档,mongodb中的文档将如下所示:

{ "_id" : ObjectId("5510d1ad7f8b9aaf318b457b"), "0" : "a", "1" : "b", "2" : "c", "d" : [ NumberLong(1), NumberLong(2), NumberLong(3), NumberLong(4) ], "tags" : [ "mongodb", "mysql", "redis" ] }

为什么mongodb自动为我添加一些键:"0"、"1"、"3"但是标签值没有?

<?php 
$doc = array(
    'a',
    'b',
    'c',
    'd' => array(1,2,3,4),
    "tags" => array('mongodb', 'mysql', 'redis')
);
$client = new MongoClient();
$client->d->test->insert($doc);
$cursor = $client->d->test->find();
foreach($cursor as $item)
{
    echo "<br>";
    echo json_encode($item);
}

引用文档

可以使用array()语言构造创建数组。它采用任意数量的逗号分隔键=>值对作为参数。

如果您没有指定可选的键值,PHP将使用以前使用的最大整数键的增量。因此print_r($doc)将显示在输出下方。

Array
(
    [0] => a
    [1] => b
    [2] => c
    [d] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )
    [tags] => Array
        (
            [0] => mongodb
            [1] => mysql
            [2] => redis
        )
)

话虽如此。

为什么mongodb自动为我添加了一些键:"0"、"1"、"3",但标记值没有?

MongoDB将密钥用作文档中的字段,由于您没有为'a''b''c'整数指定密钥,因此将密钥用作字段名称,这不是您想要的。

引用文档

请注意,您可以有嵌套的数组和对象。驱动程序将始终将关联数组作为对象存储在数据库中。如果键从0开始且未被中断,则数字索引数组存储为数组;如果数组键不从0开始或有间隙(即:0、1、4、5),则存储为对象。