MongoDB更新查询(更新文档中的数组字段)

时间:2013-07-28 22:56:22

标签: php mongodb

这是文档现在的样子。

Array
(
    [email] => admin@mysite.com
    [emailQueries] => Array
        (
            [0] => Array
                (
                    [21] => 0
                )

            [1] => Array
                (
                    [21] => 0
                )

        )

    [last_visit] => 1375050871
)

以下是我用来填充emailQueries

的代码
$arrayValueToAdd = array( (string) $email_id => '0' );

$collection->update( array('email' => $user['email']), 
                     array( '$push' => 
                          array( 'emailQueries' => $arrayValueToAdd ) 
                      )
                  );

但是,我想让emailQueries数组看起来像:

[emailQueries] => Array
    (
        [21] => 0
        [22] => 0
    )

我可能会忽略一件简单的事情......

1 个答案:

答案 0 :(得分:0)

您正在使用数组结构运算符push,其数据结构不被MongoDb视为数组(array must have 0-based ascending numeric indexes)。您必须将其视为对象。 所以你有2个选择。

如果在[21] => 0中,值0没用(我不希望这样),你可以使用一个真正的数组:

"emailQueries" : [21,22]

您可以在PHP代码中使用push运算符,如下所示

$collection->update( array('email' => $user['email']), 
                     array( '$push' => 
                         array( 'emailQueries' => (string) $email_id ) 
                     ));

另一方面,如果您必须保留值0,例如,将其递增,则必须将您的EmailQuery视为对象:

"emailQueries" : {
    "21" : 0,
    "22" : 0
}

因此,您可以使用简单的更新在emailQueries中添加字段:

$collection->update( array('email' => $user['email']), 
                     array( '$set' => 
                         array( 'emailQueries.'.$email_id => 0  ) 
                     ));

$inc,用于增量:

$collection->update( array('email' => $user['email']), 
                     array( '$inc' => 
                         array( 'emailQueries.'.$email_id => 1  ) 
                     ));