MongoDB/PyMongo根据字段的存在过滤文档中的子数组

2024-09-30 12:29:18 发布

您现在位置:Python中文网/ 问答频道 /正文

在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'子数组,以仅返回没有'remark'字段的对象。我试过了,但没有任何回报:

    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'
}

我也不知道这是否会自动解释子数组中所有对象都有'remark'字段的文档,从而忽略整个父文档,或者我是否必须自己在聚合中这样做


Tags: name文档idservervaluedomainusagesome

热门问题