MongoDB использует переменную «$$ this» в качестве ключа объекта - PullRequest
1 голос
/ 14 марта 2020

Текущий код:

let someObject = {a: "hello ", b: "world", c: "!"};
...
// QUERY
$reduce: {
   input: ["a", "b", "c"],
   initialValue: "",
   in: { $concat : ["$$value", someObject["$$this"]] }
}

Ожидаемый выход:

hello world!

Токовый выход:

null

Причина:"$$ this" рассматривается как "$$this" string, а не как уменьшающая переменная $$this при использовании в качестве свойства в квадратных скобках , someObject["$$this"] is undefined.

Fix : ???

Я пробовал все, используя его внутри mon goose .Types.ObjectId (), использование его во вложенном $ concat с пустой строкой и многое другое, что я уже забыл. Я думаю, что что-то упустил. Как я могу заставить его быть $$this переменной вместо строки "$$this"

1 Ответ

1 голос
/ 14 марта 2020

Структура агрегирования MongoDB имеет $ arrayElemAt , но не $objectElemAt, где вы можете передать expression для получения значения объекта.

Обход: Нам нужно преобразовать объект в массив, отфильтровать это key:value и вернуть значение.

{a:"hello", b:"world", c:"!"} 
to 
[ {k:"a", v:"hello"}, {k:"b", v:"world"}, {k:"c", v:"!"} ]

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

db.collection.aggregate([
  {
    $addFields: {
      data: {
        $reduce: {
          input: {
            $map: {
              input: ["a","b","c"],
              as: "abc",
              in: {
                $let: {
                  vars: {
                    someObject: {
                      $filter: {
                        input: {
                          $objectToArray: {a: "hello ",b: "world",c: "!"}
                        },
                        cond: {
                          $eq: ["$$this.k","$$abc"]
                        }
                      }
                    }
                  },
                  in: {
                    $ifNull: [
                      {
                        $arrayElemAt: ["$$someObject.v", 0]
                      },
                      ""
                    ]
                  }
                }
              }
            }
          },
          initialValue: "",
          in: {
            $concat: ["$$value","$$this"]
          }
        }
      }
    }
  }
])

MongoPlayground

...