mongodb - преобразовать массив объектов (ключ: «имя ключа», значение: «значение») в поля с именем «имя ключа» с соответствующим значением - PullRequest
1 голос
/ 13 июня 2019

Текущая структура моих документов mongodb :

{
  "_id": "5c9376110a32bd172c0c5a28",
  "timestamp": 1553168075444,
  "content": [
    {
      "name": "temperature_x",
      "value": 2
    },
    {
      "name": "temperature_y",
      "value": 2
    },
    {
      "name": "temperature_z",
      "value": 0
    }
  ]
},
{
  "_id": "5c9376110a32bd172c0c5a28",
  "timestamp": 1553168075444,
  "content": [
    {
      "name": "temperature_x",
      "value": 2
    },
    {
      "name": "vibration_x",
      "value": 21
    },
    {
      "name": "vibration_z",
      "value": 10
    }
  ]
}

Я хотел бы получить запрашиваемый ярлык (представление?), К которому я сделаю запрос с помощью python, чтобы выполнить анализ данных / науку о данных, где желаемая структура документа :

{
  "_id": "5c9376110a32bd172c0c5a28",
  "timestamp": 1553168075444,
  "temperature_x": 1,
  "temperature_y": 2,
  "temperature_z": 0
},
{
  "_id": "5c9376110a32bd172c0c5a28",
  "timestamp": 1553168075444,
  "temperature_x": 2,
  "vibration_y": 21,
  "vibration_z": 10
}

Любая помощь приветствуется

Спасибо

A

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$mergeObjects": [
        "$$ROOT",
        { "$arrayToObject": {
          "$map": {
            "input": "$content",
            "in": {
              "k": "$$this.name",
              "v": "$$this.value"
            }
          }
        }}
      ]
    }
  }},
  { "$project": { "content": 0 }}
])

Выход

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "temperature_x": 2,
    "temperature_y": 2,
    "temperature_z": 0,
    "timestamp": 1.553168075444e+12
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "temperature_x": 2,
    "timestamp": 1.553168075444e+12,
    "vibration_x": 21,
    "vibration_z": 10
  }
]
0 голосов
/ 13 июня 2019
dictt={
  "_id": "5c9376110a32bd172c0c5a28",
  "timestamp": 1553168075444,
  "content": [
    {
      "name": "temperature_x",
      "value": 1
    },
    {
      "name": "temperature_y",
      "value": 2
    },
    {
      "name": "temperature_z",
      "value": 0
    }
  ]
}

new_dict=dictt.copy()

for i in dictt['content']:
    new_dict[i['name']]=i['value']

new_dict["content"]=None
print(new_dict)

или вы можете сделать на месте

dictt={
  "_id": "5c9376110a32bd172c0c5a28",
  "timestamp": 1553168075444,
  "content": [
    {
      "name": "temperature_x",
      "value": 1
    },
    {
      "name": "temperature_y",
      "value": 2
    },
    {
      "name": "temperature_z",
      "value": 0
    }
  ]
}



for i in dictt['content']:
    dictt[i['name']]=i['value']

dictt["content"]=None
print(dictt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...