MongoDB / PyMongo - фильтрует подмассив в документе на основе существования поля - PullRequest
0 голосов
/ 21 марта 2019

В MongoDB у меня есть данные, которые структурированы так:

"perfdata" collection:

{ '_id': ObjectId("SomeMongoId"),
  'hostName': 'some-server-name.domain.local',
  'ipAddress': 'some.address.goes.here',
  'perfData': [
       { 'name': 'CPU Usage', 'value': 14 },
       { 'name': 'Memory Usage', 'value': 900, 'remark': 'This is hideously broken' }
  ]
  'dateAdded': '2019-03-21'
}

Используя pymongo, я пытаюсь написать функцию, которая найдет все документы в коллекции, соответствующие полю 'dateAdded' , а затем отфильтрует их 'perfData' подмассивы для возврата только тех объектов, которые не имеют поле 'примечание' . Я попробовал это, но ничего не получилось:

    pipeline = [{'$match': {'dateAdded': str(date)}},
        {'$addFields': {'remark': {'$filter': {'input': '$perfData.remark', 'as': 'remark', 'cond': {'$exists': False}}}}}]
    entries = mongo.dbname.perfdata.aggregate(pipeline)

Для пояснения вот мой ожидаемый результат:

{ '_id': ObjectId("SomeMongoId"),
  'hostName': 'some-server-name.domain.local',
  'ipAddress': 'some.address.goes.here',
  'perfData': [
       { 'name': 'CPU Usage', 'value': 14 },
  ]
  'dateAdded': '2019-03-21'
}

Я также не знаю, будет ли это автоматически учитывать документы, в которых все объекты в подмассиве имеют поле 'примечание' и, таким образом, пропускает весь родительский документ, или если я ' Придется ли это делать самому в агрегации?

...