【问题标题】:MongoDB Search nested Objects without knowing KeyMongoDB在不知道Key的情况下搜索嵌套对象
【发布时间】:2019-12-27 16:15:52
【问题描述】:

由于使用异步 Java 驱动程序 + BSON,我有一个对象列表,这些对象被赋予了一些任意的对象键。

我的问题是jobStatuses 是我不知道键的字典项的任意列表,我不知道如何访问它的子值。最后,我正在尝试构建一个查询,如果jobStatus.*._id 中的任何一个在给定潜在对象 ID 列表的情况下为真,则返回该查询。

所以我会给出一个 ID 列表,如果 jobStatuses 中的任何项目具有任何给定的 ID,我想返回 true。有什么想法吗?

【问题讨论】:

    标签: java mongodb bson


    【解决方案1】:

    让我们试试这个:

    db.yourCollectionName.aggregate([
        {
            $project: {
                _id: 0,
                jobStatutses: { $arrayElemAt: [{ $objectToArray: "$jobStatutses" }, 0] }
            }
        }, {
            $match: { 'jobStatutses.v._id': { $in: [ObjectId("5d6d8c3a5a0d22d3c84dd6dc"), ObjectId("5d6d8c3a5a0d22d3c84dd6ed")] } }
        }
    ])
    

    收集数据:

    /* 1 */
    {
        "_id" : ObjectId("5e06319c400289966eea6a07"),
        "jobStatutses" : {
            "5d6d8c3a5a0d22d3c84dd6dc" : {
                "_id" : ObjectId("5d6d8c3a5a0d22d3c84dd6dc"),
                "accepted" : "123",
                "completed" : 0
            }
        },
        "something" : 1
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5e0631ad400289966eea6dd1"),
        "jobStatutses" : {
            "5d6d8c3a5a0d22d3c84dd6ed" : {
                "_id" : ObjectId("5d6d8c3a5a0d22d3c84dd6ed"),
                "accepted" : "456",
                "completed" : 0
            }
        },
        "something" : 2
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5e0631cd400289966eea7542"),
        "jobStatutses" : {
            "5e06319c400289966eea6a07" : {
                "_id" : ObjectId("5e06319c400289966eea6a07"),
                "accepted" : "789",
                "completed" : 0
            }
        },
        "something" : 3
    }
    

    输出:

    /* 1 */
    {
        "jobStatutses" : {
            "k" : "5d6d8c3a5a0d22d3c84dd6dc",
            "v" : {
                "_id" : ObjectId("5d6d8c3a5a0d22d3c84dd6dc"),
                "accepted" : "123",
                "completed" : 0
            }
        }
    }
    
    /* 2 */
    {
        "jobStatutses" : {
            "k" : "5d6d8c3a5a0d22d3c84dd6ed",
            "v" : {
                "_id" : ObjectId("5d6d8c3a5a0d22d3c84dd6ed"),
                "accepted" : "456",
                "completed" : 0
            }
        }
    }
    

    您只需要检查是否从给定列表的数据库中返回了至少一个文档,因此我们无需担心文档结构,然后只需在您的代码中执行result.length 即可说出至少一个doc 与输入列表匹配。

    【讨论】:

    • 甜蜜!这似乎可以正确进行匹配。然后如何返回整个文档作为结果,而不仅仅是 jobStatuses 的数据?
    • @Cryptite :您需要来自 DB 的整个文档吗?在这种情况下,此操作可能会变得有点庞大,这没关系,取决于您的集合数据和索引 - 试一试 - 如果需要,则在 $project 阶段删除 _id 并用 $addFields 替换 $project 并替换jobStatutsesjobStatutsesArr & atlast 添加第三阶段 $project 以删除 jobStatutsesArr。结果看起来和你原来的文档差不多!!
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 2021-06-28
    • 2019-10-14
    • 2021-07-04
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多