来自多维数组的mongodb pull元素

时间:2014-05-30 15:02:32

标签: php mongodb

您好我有以下数组,我想用productId 100343

拉数组
Array(
    [_id] => MongoId Object
        (
            [$id] => 5388a02c8ead0ebf048b4569
        )

    [cartId] => 14ce496ac194d5d8ee8d0cd11bd3ef5a
    [products] => Array
        (
            [100343] => Array
                (
                    [productId] => 100343
                    [quantity] => 13
                    [name] => a
                )

            [100344] => Array
                (
                    [productId] => 100344
                    [quantity] => 3
                    [name] => ab
                )

            [100345] => Array
                (
                [productId] => 100345
                    [quantity] => 1
                    [name] => abc
                )

        )

)

我试过这样但是它没有用

$c->update(
    $aQuery, 
    array(
        '$pull' => array('products'=>array('productId'=>'100343'))
    )
);

1 个答案:

答案 0 :(得分:1)

那不是数组。 MongoDB中的数组在概念上与PHP调用数组不同,因此您在那里的结构与此JSON表示相同:

{
    "products": {
        "100343": {
            "productId": 100343,
            "quantity": 13,
            "name": "a"
        },
        "100344": {
            "productId": 100344,
            "quantity": 3,
            "name": "ab"
        },
        "100345": {
            "productId": 100345,
            "quantity": 1,
            "name": "abc"
        }
    }
}

这种结构只是子文档的使用,并不是MongoDB使用的意义上的数组。要使用此结构删除条目,请使用$unset运算符。

$c->update(
    $aQuery, 
    array(
        '$unset' => array('products.productId.100343' => "")
    )
);

但实际上您需要更改数据,因此要为MongoDB序列化正确的数组,您需要构建如下代码:

$data = array(
    "products" => array(
         array(
             "productId" => 100343,
             "quantity" => 13,
             "name" => "a"
         ),
         array(
             "productId" => 100344,
             "quantity" => 3,
             "name" => "ab"
         ),
         array(
             "productId" => 100345,
             "quantity" => 1,
             "name" => "abc"
         )
     )
 );

这会产生一个如下所示的JSON结构:

{
    "products":[
        {
            "productId":100343,
            "quantity":13,
            "name":"a"
        },
        {
            "productId":100344,
            "quantity":3,
            "name":"ab"
        },
        {
            "productId":100345,
            "quantity":1,
            "name":"abc"
        }
    ]
}

这就是MongoDB所谓的数组,所以现在你可以正确使用$pull运算符:

$c->update(
    $aQuery, 
    array(
        '$pull' => array( 'products.productId' => 100343 )
    )
);