PyMongo запрашивает документы, которых нет в другой коллекции - PullRequest
0 голосов
/ 13 января 2019

У меня есть 2 таблицы: messages и responded_messages

Оба имеют ключ под названием message_id.

Я хотел бы получить все документы из сообщений, которые не находятся в responseded_messages, на основе message_id. Как бы я это сделал в PyMongo?

Для примера списка Python,

messages = [1,2,3]
responded_messages= [3]

Результат должен быть [1,2]

Я изучил структуру агрегации и чувствую, что это как-то связано с этим, но не могу указать на нее пальцем.

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 24 января 2019

По сути, вам нужно выполнить LEFT JOIN между двумя коллекциями, где responded_messages равно NULL.

Этого можно добиться с помощью оператора агрегации MongoDB $ lookup .

Например, для данной коллекции messages, как показано ниже:

{ "_id": 1, "message_id": 1 }
{ "_id": 2, "message_id": 2 }
{ "_id": 3, "message_id": 3 }

и коллекция responded_messages, как показано ниже:

{ "_id": 1, "message_id": 3 }

Используя PyMongo , вы можете сделать:

collection = client["dbName"]["messages"]

pipeline = [{'$lookup': 
                {'from' : 'responded_messages',
                 'localField' : 'message_id',
                 'foreignField' : 'message_id',
                 'as' : 'responses'}
             },
             {'$match': {'responses' : {"$size": 0} } },
            ]

for doc in (collection.aggregate(pipeline)):
    print(doc)

См. Также Примеры агрегации PyMongo

...