【问题标题】:$elemMatch for filtering out referenced($ref) array objects in mongodb is not working$elemMatch 用于过滤 mongodb 中的引用($ref)数组对象不起作用
【发布时间】:2020-06-02 16:25:13
【问题描述】:

我有 2 个集合 student_details 和 subject_details,每个学生可以有多个科目,我将这些科目存储在 student_details 集合中作为参考数组。

现在我需要获取学生详细信息以及经过过滤的主题,其中 subject_details.status=ACTIVE。

如何使用$elemMatch 处理$ref 对象来实现这一点。 我正在使用类似下面的东西,但它没有返回任何记录。

db.getCollection('student_details').find( { subjects: { $elemMatch: { $ref: "subject_details", status: 'ACTIVE' }}})

student_details
================
{
    "_id" : "STD-1",
    "name" : "XYZ",
    "subjects" : [ 
        {
            "$ref" : "subject_details",
            "$id" : "SUB-1"
        },
        {
            "$ref" : "subject_details",
            "$id" : "SUB-2"
        },
        {
            "$ref" : "subject_details",
            "$id" : "SUB-3"
        }
    ]
}

subject_details
===============
{
    "_id" : "SUB-1",
    "name" : "MATHEMATICS",
    "status" : "ACTIVE"
}

{
    "_id" : "SUB-2",
    "name" : "PHYSICS",
    "status" : "ACTIVE"
}

{
    "_id" : "SUB-3",
    "name" : "CHEMISTRY",
    "status" : "INACTIVE"
}


【问题讨论】:

标签: mongodb spring-boot mongodb-query spring-data spring-data-mongodb


【解决方案1】:

dbref 在查找中使用时很麻烦。但您可以使用以下聚合管道解决它:

db.student_details.aggregate([
    {
        $unwind: "$subjects"
    },
    {
        $set: {
            "fk": {
                $arrayElemAt: [{
                    $objectToArray: "$subjects"
                }, 1]
            }
        }
    },
    {
        $lookup: {
            "from": "subject_details",
            "localField": "fk.v",
            "foreignField": "_id",
            "as": "subject"
        }
    },
    {
        $match: {
            "subject.status": "ACTIVE"
        }
    },
    {
        $group: {
            "_id": "$_id",
            "name": {
                $first: "$name"
            },
            "subjects": {
                $push: {
                    $arrayElemAt: ["$subject", 0]
                }
            }
        }
    }
])

生成的对象会是这样的:

{
    "_id": "STD-1",
    "name": "XYZ",
    "subjects": [
        {
            "_id": "SUB-1",
            "name": "MATHEMATICS",
            "status": "ACTIVE"
        },
        {
            "_id": "SUB-2",
            "name": "PHYSICS",
            "status": "ACTIVE"
        }
    ]
}

【讨论】:

  • 你为什么说它作为解决方法,这不是一种正确的处理方式吗?
  • 解决方法只是您需要将 dbref 转换为数组的部分,因为 dbrefs 不能直接在 $lookup 中使用。如果您只是使用 objectid 来引用,那么您不需要解决方法。
【解决方案2】:

因为它们在 2 个集合中,所以您需要 $lookUp 将它们组合在一起...在此之前,我相信您需要 $unwind 主题数组...这里有一种空气代码,所以这不是一般的答案建议...聚合管道用于分阶段执行这些...

我假设您正在缩写帖子...因为如果主题详细信息实际上只是 3 个字段,那么您的架构在 NoSQL 世界中更好地服务,只需将该信息与学生详细信息一起使用并使用 1 个集合而不是规范化的关系方法

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2021-08-03
    • 1970-01-01
    • 2020-05-25
    • 2020-05-30
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多