Php 如何在MongoDB中按键删除特定的转租

Php 如何在MongoDB中按键删除特定的转租,php,mongodb,Php,Mongodb,如何按键删除数组元素 文档似乎表明这就像按名称识别密钥一样简单,但这似乎不起作用 例如,使用下面的images数组和一个键59db1c3654819952005897,我无法删除元素(下面的代码不会产生错误,但不会删除任何内容): 以下是数据结构: "_id" : 34, "images": [ { "59db1c3654819952005897": { "name": "1024x1024.png", "size":

如何按键删除数组元素

文档似乎表明这就像按名称识别密钥一样简单,但这似乎不起作用

例如,使用下面的images数组和一个键
59db1c3654819952005897
,我无法删除元素(下面的代码不会产生错误,但不会删除任何内容):

以下是数据结构:

"_id" : 34,  
"images": [
    {
        "59db1c3654819952005897": {
            "name": "1024x1024.png",
            "size": "19421",
            "sort": 2
        }
    },
    {
        "59db1c3652cda581935479": {
            "name": "200x200.png",
            "size": "52100",
            "sort": 3
        }
    }
]

您遇到的问题是,您的
pull
查询正在查找
images
的值等于
59db1c3654819952005897
的文档,而在您的情况下,这不是真的

即使尝试使用指定的参数执行
find
查询,也不会返回任何结果:

db.getCollection('collection').find({
    'images': '59db1c3654819952005897'
});
要解决此问题,必须找到一个能够检索文档的查询,如下所示:

db.getCollection('collection').find({
    'images': {
        '59db1c3654819952005897': {
            '$exists': true
        }
    }
});
现在要更新您的
$pull
查询:

db.getCollection('collection').updateOne({'_id': 34}, {
    '$pull': {
        'images': {
            '59db1c3654819952005897': {
                '$exists': true
            }
        }
    }
});
因此,在PHP中,它将是:

$id = '59db1c3654819952005897';
updateOne(['_id' => 34], ['$pull' => [
    'images' => [
        $id => [
            '$exists' => true
        ]
    ]
]]);

换句话说,如果文档中存在
\u id
34

的文档,那么它将引入
图像
数组
59db1c3654819952005897
。。。虽然这是奇怪的,给一个关键,你也必须添加“如果它存在”谢谢!因为您将
作为
值进行比较!欢迎:)
$id = '59db1c3654819952005897';
updateOne(['_id' => 34], ['$pull' => [
    'images' => [
        $id => [
            '$exists' => true
        ]
    ]
]]);