首页 > 解决方案 > 从子数组中的 DBRef 获取 ObjectId

问题描述

我的收藏:

{
    "_id": ObjectId("..."),
    // .. some fields
    "mySubArray": [
        {
            "field1": "{\"$ref\": \"otherCollection\", \"$id\": \"...\", \"$db\": \"sameDataTable\"}", // string
            // .. some other fields
        }
    ] 
},
{
    "_id": ObjectId("..."),
    // .. some fields
    "mySubArray": []
}

我想做$lookupotherCollection但首先我需要从field1字符串中获取 ObjectId mySubArray

我试图做的是在里面选择$arrayElemAt这个$mapObjectId $project

[
    { 
        "$match" : {
            // my match
        },
        {
            "$project": { 
                "its": {
                    "$map": { 
                        "input": { 
                            "$map": {
                                "input": "$mySubArray",
                                "as": "element",
                                "in": {
                                    "field1": {
                                        "$arrayElemAt": [
                                            {
                                               "$objectToArray": "$element.field1"
                                            },
                                            1
                                        ]
                                    }
                                },
                            }
                        },
                        "in": "$$this.v"
                    }
                }
            }
        }/*, 
        {
            $lookup: {
                from:"otherCollection", 
                localField:"mySubArray.id",
                foreignField:"_id", 
                as:"mySubArray.myNewField"
            }
        }*/
    ]

所以它看起来像这样:

{
    "_id": ObjectId("..."),
    // .. some fields
    "mySubArray": [
        {
            "field1": "{\"$ref\": \"otherCollection\", \"$id\": \"...\", \"$db\": \"sameDataTable\"}", // string
            "myNewFiled": {
                //my new object that i get with $lookup 
            }
            // .. some other fields
        }
    ] 
},
{
    "_id": ObjectId("..."),
    // .. some fields
    "mySubArray": []
}

但我得到的是没有其他字段_id,但mySubArray里面有 null:

{ 
    "_id" : ObjectId("..."), 
    "mySubArray" : [
        null
    ]
}

标签: mongodbmongodb-query

解决方案


致@turrivishal @d-sm

问题是我无法控制推送到数据库,我只需要从中读取数据。

顺便说一句,我找到了方法:

  1. $unwind我的子数组
  2. $addFileds从字符串中$regexFind获取$id
  3. $unwind正则表达式捕获(因为我获取一组)
  4. $addFields用于将正则表达式字符串结果转换为ObjectId
  5. $lookup
  6. $unwind查找结果(因为它是数组,即使我查找一个对象)
  7. $groupmySubArray 返回

推荐阅读