Как сопоставить подмассив mongodb на основе основного идентификатора документа? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующий конвейер в моем скрипте 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'}}
]

Мне нужно изменить последнюю строку кода, чтобы мне не нужно было указывать идентификатор документа вручную, а взять его изисходный документ.

Я безуспешно пробовал следующее:

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

Не могли бы вы мне помочь?

Кроме того, это самый эффективный способ сделать это?или я должен использовать $ project?Я пытался использовать его, но я не знаю структуру документа, и мне нужно каждое поле в документах.Я не уверен, есть ли способ не указывать «1» в операторе $ filter (так как я не знаю имен ключей)

Заранее спасибо

1 Ответ

0 голосов
/ 24 октября 2018

В версии 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"}
]
...