【问题标题】:MongoDb nested remove queryMongoDb 嵌套删除查询
【发布时间】:2016-11-28 12:02:54
【问题描述】:

我有一个这样的集合:

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

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

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

我说的逻辑是这样的,把它当成伪代码吧。

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#版本)

【问题讨论】:

    标签: c# mongodb nested-queries


    【解决方案1】:

    我认为 $elemMatch 是您所缺少的。这将允许您使用嵌入文档中的字段来识别项目。这结合 $in 和 $pull 你将能够实现你想要的

    MongoDB Documentation - ElemMatch

    【讨论】:

    • 有什么方法可以详细说明吗?也许举个例子?
    猜你喜欢
    • 2021-06-20
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-06-22
    • 2021-06-29
    • 2021-02-25
    • 2016-08-16
    相关资源
    最近更新 更多