узел API для извлечения вложенных документов с помощью мангуста - PullRequest
2 голосов
/ 03 февраля 2020

В моем MongoDB хранятся документы, имеющие следующую структуру:

{
    "application_detail":{},
    "curl_detail":{
        "Curl1":{
            "key1":"value1",
            "key2":"value2"
        },
        "Curl2":{
            "key1":"value1",
            "key2":"value2"        
        },
        "Curl3":{
            "key1":"value1",
            "key2":"value2"
        },
        "Curl4":{
            "key1":"value1",
            "key2":"value2"
        },
        /*total number of curls are unknown*/
    }
}

Как мне извлечь key1 для всех локонов, представленных в curl_detail, из mongoDB, используя express и mon goose?

Ожидаемый результат:

{
    "curl_detail": {
        "Curl1": {
            "key1": "value1"
        },
        "Curl2": {
            "key1": "value1"
        },
        "Curl3": {
            "key1": "value1"
        },
        "Curl4": {
            "key1": "value1"
        }
    }
}

ПРИМЕЧАНИЕ. Общее количество локонов неизвестно.

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Я хотел бы предложить вам изменить структуру данных с

"curl_detail": {
    "Curl1": {
        "key1": "value1",
        "key2": "value2"
    },
    "Curl2": {
        "key1": "value1",
        "key2": "value2"
    }
}

на

"curl_detail": [{
        "key1": "value1",
        "key2": "value2"
    },
    {
        "key1": "value1",
        "key2": "value2"
    }
]

Хранение структуры данных в массиве позволит вам легче находить некоторые данные. Также нет необходимости иметь объект со свойствами, такими как Curl1, Curl2 et c.

Для новой структуры данных уже есть некоторые ответы с объяснением:

1) Пн go найти значение с неизвестным родительским ключом

2) Запрос MongoDB по значению, когда родительский ключ неизвестен

3) MongoDB: Найти документ с заданными значениями полей в объекте с неизвестным ключом

ОБНОВЛЕНИЕ

Если нет возможности изменить структуру данных, см. Это решение ( трюк с использованием $arrayToObject / $objectToArray для определения имени вложенного ключа, например, "Curl1"):

db.collection.aggregate([{
        $addFields: {
            curl_detail: {
                $arrayToObject: {
                    $map: {
                        input: {
                            $objectToArray: "$curl_detail"
                        },
                        as: "details",
                        in: {
                            k: "$$details.k",
                            v: {
                                key1: "$$details.v.key1"
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            curl_detail: 1
        }
    }
])

Это выводит следующее:

[
  {
    "curl_detail": {
      "Curl1": {
        "key1": "value1"
      },
      "Curl2": {
        "key1": "value1"
      },
      "Curl3": {
        "key1": "value1"
      },
      "Curl4": {
        "key1": "value1"
      }
    }
  }
]

Вы можете проверить это через пн go площадка

0 голосов
/ 03 февраля 2020

Если этот результат также работает для вас:

[
  {
    "curl_detail": {
      "Curl1": "value1",
      "Curl2": "value1",
      "Curl3": "value1",
      "Curl4": "value1"
    }
  }
]

Вы можете использовать следующую агрегацию, используя $ objectToArray и $ arrayToObject

db.collection.aggregate([
  {
    $addFields: {
      curl_detail: {
        $map: {
          "input": {
            "$objectToArray": "$curl_detail"
          },
          "as": "el",
          "in": {
            "k": "$$el.k",
            "v": "$$el.v.key1",

          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      curl_detail: {
        $arrayToObject: "$curl_detail"
      }
    }
  }
])

Детская площадка

Вы можете использовать это агрегирование с mon goose, например, скажем, ваша модель MyModel:

MyModel.aggregate([
  {
    $addFields: {
      curl_detail: {
        $map: {
          input: {
            $objectToArray: '$curl_detail'
          },
          as: 'el',
          in: {
            k: '$$el.k',
            v: '$$el.v.key1'
          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      curl_detail: {
        $arrayToObject: '$curl_detail'
      }
    }
  }
]).then(res => {
  console.log(res);
});
0 голосов
/ 03 февраля 2020

Вы можете использовать проекцию для запроса, который вы ищете:

collection.find({}, {"curl_detail":1}, (findError, results) => {
  if(findError) { 
    //handle the error
    return;
  }
  // here is the expected result
  console.log();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...