Как использовать переменные PHP в запросе HEREDOC SQL?

На самом деле другой ответ неверен. Можно выполнить поиск в поле DBref внутри вашего агрегатора, и для этого вам не требуется mapreduce.

Решение

db.A.aggregate([
{
    $project: { 
        B_fk: {
          $map: { 
             input: { 
                  $map: {
                      input:"$bid",
                      in: {
                           $arrayElemAt: [{$objectToArray: "$$this"}, 1]
                      },
                  }
             },
             in: "$$this.v"}},
        }
}, 
{
    $lookup: {
        from:"B", 
        localField:"B_fk",
        foreignField:"_id", 
        as:"B"
    }
])

result

{
    "_id" : ObjectId("59bb79df1e9c00162566f581"),
    "B_fk" : null,
    "B" : [ ]
},
{
    "_id" : ObjectId("582abcd85d2dfa67f44127e1"),
    "B_fk" : [
        ObjectId("582abcd85d2dfa67f44127e0"),
        ObjectId("582abcd85d2dfa67f44127e1")
    ],
    "B" : [
        {
            "_id" : ObjectId("582abcd85d2dfa67f44127e0"),
            "status" : NumberInt("1"),
            "seq" : NumberInt("0")
        }
    ]
}

Краткое пояснение

Прокрутите DBRefs с помощью $ map, разделите каждый DBref на массив, сохраните только поле $ id, а затем избавитесь от формата k: v с помощью $$ this.v , сохраняя только ObjectId и удаляя все остальное. Теперь вы можете искать ObjectId.

Пошаговое объяснение

В агрегаторе тип DBRef BSON можно обрабатывать как объект с двумя или тремя полями (ref , id и db).

Если вы это сделаете:

db.A.aggregate([
    {
        $project: { 
            First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
            Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
            }

    },

])

Это результат:

{
"_id" : ObjectId("582abcd85d2dfa67f44127e1"),
"First_DBref_as_array : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId("582abcd85d2dfa67f44127e0")
    }
],
"Second_DBref_as_array" : [
    {
        "k" : "$ref",
        "v" : "B"
    },
    {
        "k" : "$id",
        "v" : ObjectId("582abcd85d2dfa67f44127e0")
    }
]
}

Как только вы преобразовали dbref в массив, вы можете избавиться от бесполезных полей, запросив только значение в индексе 1, например:

db.A.aggregate([
    {
        $project: { 
            First_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            Second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            }

    },

])

result:

{
    "_id" : ObjectId("582abcd85d2dfa67f44127e1"),
    "First_DBref_as_array" : {
        "k" : "$id",
        "v" : ObjectId("582abcd85d2dfa67f44127e0")
    },
    "Second_DBref_as_array" : {
        "k" : "$id",
        "v" : ObjectId("582abcd85d2dfa67f44127e0")
    }
}

Затем вы можете получить окончательно к значению, которое вы хотите, указав на «$ myvalue.v», точно так же, как это

db.A.aggregate([
    {
        $project: { 
            first_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
            }

    },
    {
        $project: {
            first_DBref_as_ObjectId: "$first_DBref_as_array.v",
            second_DBref_as_ObjectId: "$second_DBref_as_array.v"
        }
    }

])

. Результат:

{
    "_id" : ObjectId("582abcd85d2dfa67f44127e1"),
    "first_DBref_as_ObjectId" : ObjectId("582abcd85d2dfa67f44127e0"),
    "second_DBref_as_ObjectId" : ObjectId("582abcd85d2dfa67f44127e0")
}

Очевидно, что в нормальном конвейере вы не " t нужно все эти избыточные шаги, используя вложенную карту $, вы можете получить один и тот же результат за один раз:

db.A.aggregate([
    {
        $project: { 
            B_fk: { $map : {input: { $map: {    input:"$bid",
                                    in: { $arrayElemAt: [{$objectToArray: "$$this"}, 1 ]}, } },
                            in: "$$this.v"}},

            }
    }, 

])

результат:

{
    "_id" : ObjectId("582abcd85d2dfa67f44127e1"),
    "B_fk" : [
        ObjectId("582abcd85d2dfa67f44127e0"),
        ObjectId("582abcd85d2dfa67f44127e1")
    ]
}

Надеюсь, что объяснение достаточно ясно, если вы не можете спросить.

3
задан Chipster 28 March 2019 в 04:19
поделиться

1 ответ

Попробуйте это:

$sql = <<<SQL
    SELECT *
    FROM `users`, `passwords`
    WHERE users.User_id = passwords.User_id 
    AND "{$formusername}" = users.User_name
    AND "{$formpassword}" = passwords.User_password
SQL;

Проблема в том, что в переменных отсутствуют кавычки ("), например, {$formusername} вместо "{$formusername}". Надеюсь, что это решит проблему.

0
ответ дан J.Koriya 28 March 2019 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: