MongoDB 在不知道 Key 的情况下搜索嵌套对象

MongoDB Search nested Objects without knowing Key

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

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

所以我会给出一个 ID 列表,如果 jobStatuses 中的任何项目具有任何给定的 ID,我希望 return 为真。有什么想法吗?

让我们试试这个:

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 即可假设至少有一个文档与输入列表匹配。