Получить ObjectId из DBRef внутри подмассива - PullRequest
0 голосов
/ 04 августа 2020

Моя коллекция:

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

Я хочу сделать от $lookup до otherCollection, но сначала мне нужно получить ObjectId из field1 строки из mySubArray.

Что я пытался сделать, так это выбрать этот ObjectId с $arrayElemAt с $map внутри $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 с нулем внутри:

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

1 Ответ

0 голосов
/ 06 августа 2020

To @turivishal @ d-sm

Проблема в том, что я не могу контролировать нажатие на db, мне просто нужно читать данные из него.

Кстати, я нашел путь:

  1. $unwind mySubArray
  2. $addFileds с $regexFind, чтобы получить $id из строки
  3. $unwind захваты регулярных выражений (поскольку я получаю одну группу)
  4. $addFields для преобразования результата строки регулярного выражения в ObjectId
  5. $lookup
  6. $unwind результаты поиска (поскольку это массив даже если я ищу один объект)
  7. $group mySubArray назад
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...