PyMongo查询另一个集合中不存在的文档

时间:2019-01-13 14:56:23

标签: python mongodb aggregation-framework pymongo

我有2个表:messagesresponded_messages

两者都有一个名为message_id的密钥。

我想基于message_id从不在响应消息中的消息中获取所有文档。我将如何在PyMongo中做到这一点?

对于python列表示例,

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

结果应为[1,2]

我查看了聚合框架,并认为这是与之相关的,但是我无法对此进行指点。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

基本上,您要寻找的是在两个LEFT JOINresponded_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 Aggregation Examples