首页 > 解决方案 > 如何根据主文档 id 匹配 mongodb 子数组?

问题描述

我的 pymongo 脚本中有以下管道:

pipeline = [
    {'$match': {'_id': '123456'}},
    {'$lookup': {
    'from': 'Case', 
    'localField': '_id', 
    'foreignField': 'RecordList.Record._id', 
    'as': 'CaseInfo'}
    },
   {'$unwind':'$CaseInfo'},
   {'$unwind':'$CaseInfo.RecordList'},
   {'$unwind':'$CaseInfo.RecordList.Record'},
   {'$match': {'CaseInfo.RecordList.Record._id': '123456'}}
]

我需要更改最后一行代码,这样我就不需要手动指定文档 ID,而是从初始文档中获取它。

我试过以下没有运气:

{'$match': {'CaseInfo.RecordList.Record._id': '_id'}}
{'$match': {'CaseInfo.RecordList.Record._id': '$_id'}}

请你帮助我好吗?

另外,这是完成此任务的最有效方法,还是我应该使用 $project?我尝试使用它,但我不知道文档的结构,我需要文档中的每个字段。我不确定是否有办法在 $filter 运算符中不指定“1”(因为我不知道键名)

提前致谢

标签: pythonmongodbaggregation-frameworkpymongo

解决方案


在 3.6 版本中,您可以将最后一行更改为

{'$match': {$expr:{$eq:['$CaseInfo.RecordList.Record._id', '$_id']}}}.

或者,您可以重写聚合以$lookup与管道变体一起使用。

就像是

[
  {"$match":{"_id":"123456"}},
  {"$lookup":{
    "from":"Case",
    "let":{"_id":"$_id"},
    "pipeline":[
      {"$unwind":"$RecordList"},
      {"$unwind":"$RecordList.Record"},
      {"$match":{"$expr":{"$eq":["$RecordList.Record._id","$$_id"]}}}
    ],
    "as":"CaseInfo"
  }},
  {"$unwind":"$CaseInfo"}
]

推荐阅读