基于object关键字从数组中删除特定对象的MongoDB查询

基于object关键字从数组中删除特定对象的MongoDB查询,mongodb,Mongodb,我正在尝试删除分布在数千个错误迁移的文档上的数十万个数组对象,但无法使查询正常工作。如果对象中的单个字段匹配,我需要删除整个数组对象。以下是示例数据: { "_id": { "$oid": "5f11d4c28663f32e940696e0" }, "Widgets": [{ "WidgetId": 1, "Name

我正在尝试删除分布在数千个错误迁移的文档上的数十万个数组对象,但无法使查询正常工作。如果对象中的单个字段匹配,我需要删除整个数组对象。以下是示例数据:

{
    "_id": {
        "$oid": "5f11d4c28663f32e940696e0"
    },
    "Widgets": [{
        "WidgetId": 1,
        "Name": "Basic Widget",
        "YearLaunched": 2011,
        "InitialProduction": 50000,
        "WidgetIdLegacy": "leg-0120"
    }, {
        "WidgetId": 2,
        "Name": "Advanced Widget",
        "YearLaunched": 2013,
        "InitialProduction": 35000,
        "WidgetIdLegacy": "leg-0150"
    }, {
        "WidgetId": 3,
        "Name": "Prototype Widget",
        "YearLaunched": 2009,
        "InitialProduction": 100,
        "WidgetIdLegacy": "ptp-0004"
    }],
    "Manufacturer": "WidgetCo",
    "Status": 3,
}
{
    "_id": {
        "$oid": "5f11d4c28663f32e940696e1"
    },
    "Widgets": [{
        "WidgetId": 10,
        "Name": "Widget 2.0",
        "YearLaunched": 2017,
        "InitialProduction": 150000,
        "WidgetIdLegacy": "leg-5099"
    }, {
        "WidgetId": 20,
        "Name": "Advanced Widget 2.0",
        "YearLaunched": 2018,
        "InitialProduction": 10000,
        "WidgetIdLegacy": "leg-5199"
    }, {
        "WidgetId": 3,
        "Name": "Prototype Widget",
        "YearLaunched": 2009,
        "InitialProduction": 100,
        "WidgetIdLegacy": "ptp-0004"
    }],
    "Manufacturer": "Acme Widgets",
    "Status": 3,
}
我想从Widgets数组中删除整个对象,其中Widgets.WidgetIdLegacy:“ptp-0004”

通过阅读其他类似的问题,我写了下面的查询,它似乎找到了对象,但没有拉它们,所以我知道我缺少了一些简单和基本的东西

db.getCollection("sandbox.sample").update({},{$pull: {"WidgetIdLegacy": "ptp-0004"}},{multi:true});
最终数据应如下所示:

{
    "_id": {
        "$oid": "5f11d4c28663f32e940696e0"
    },
    "Widgets": [{
        "WidgetId": 1,
        "Name": "Basic Widget",
        "YearLaunched": 2011,
        "InitialProduction": 50000,
        "WidgetIdLegacy": "leg-0120"
    }, {
        "WidgetId": 2,
        "Name": "Advanced Widget",
        "YearLaunched": 2013,
        "InitialProduction": 35000,
        "WidgetIdLegacy": "leg-0150"
    }],
    "Manufacturer": "WidgetCo",
    "Status": 3,
}
{
    "_id": {
        "$oid": "5f11d4c28663f32e940696e0"
    },
    "Widgets": [{
        "WidgetId": 10,
        "Name": "Widget 2.0",
        "YearLaunched": 2017,
        "InitialProduction": 150000,
        "WidgetIdLegacy": "leg-5099"
    }, {
        "WidgetId": 20,
        "Name": "Advanced Widget 2.0",
        "YearLaunched": 2018,
        "InitialProduction": 10000,
        "WidgetIdLegacy": "leg-5199"
    }],
    "Manufacturer": "Acme Widgets",
    "Status": 3,
}
谢谢你的帮助

尝试使用操作员删除子文档

var filter = Object.create(null);

var update = {
    $pull: {
        Widgets: {
            WidgetIdLegacy: "ptp-0004"
        }
    }
};

var options = { 
    multi: true 
};

db.collection.update(filter, update, options);
有效的解决方案

db.getCollection("sandbox.sample").update({},{$pull: {"Widgets": {"WidgetIdLegacy": "ptp-0004"}}},{multi:true});

我需要首先定义数组的名称,那就是缺少的组件

$pullAll
将不适用于此。请尝试此
db.getCollection(“sandbox.sample”).update({},{$pull:{“Widgets”:{“WidgetIdLegacy”:“ptp-0004”}},{multi:true})我粘贴了错误的查询,您是对的,$pullAll不起作用,但是$pull只找到数组对象,它没有按预期删除它们。我对我的问题做了适当的修改。非常感谢。再次阅读我的第一条评论。。它的解决方案。啊!是的,我现在看到了,谢谢!我会发布答案,非常感谢!