mongodb嵌套删除查询



我有一个与此类方案的集合:

[
    Folder: {
        _id: ObjectId(...),
        Item: [{
            _id: ObjectId(...),
            Version: [{
                _id: ObjectId(...),
                ConfirmedDevices: [ObjectId(...), ...]
            }, ...]
        }, ...]
    }
]

我需要从某个Folder中每个项目的每个版本的ConfirmedDevices数组中删除某些ID。换句话说,我有一个文件,我需要选择该文件夹。然后,我有一个ID列表,需要从该文件夹中存在的所有已确认设备中删除

我需要通过C#驱动程序执行此操作。实际上,我已经编写了执行此操作的代码,但这需要对文件夹中每个项目的每个版本进行查询。如果文件夹上的许多项目,这会导致性能问题。

我所说的逻辑是,将其作为伪代码。

for ( int i = 0; i < folder.items.Count; i++)
{
    for ( int j = 0; j < item.versions.Count; j++)
    {
        db.folders.update(
            {"_id": ObjectId("...") }, 
            { $pull: { "Items." + i + ".Versions." + j + ".ConfirmedDevices": { $in: [ ObjectId("...") ] } } },
            { multi: true }
        );
    }
}

我知道Mongodb的嵌套查询位于该概念的黑暗和贫穷的一面。但是我无法确认这是不可能的。

无论如何我可以一次实现这一目标吗?(常规MongoDB查询就足够了,我可以将其转换为C#版本)

我认为$ lemmatch是您所缺少的。这将使您可以使用嵌入式文档中的字段来识别项目。结合$ in和$ pull,您将能够实现自己想要的东西

mongoDB文档 - Elemmatch