如何在pymongo中使用投影$?

时间:2018-08-10 15:59:22

标签: mongodb pymongo pymongo-3.x

我有一个在mongo副本中运行的查询。

我有一些看起来像这样的文件...

[{              
        "_id" : ObjectId("5b6b6959828619572d48a9da"),
        "files" : [                                                                                     
                {                                                                         
                        "original_filename" : "test_file1.csv",                                                                                                                                                                                                               
                        "s3_key" : "intake/uploads/3edc78aa-2275-45ad-afcb-23bf4a765591/test_file1.csv"                                                                                                                                                                      
                },                                              
                {                                                                                                                                                                                                                                                             
                        "original_filename" : "test_file2.csv",                                                                                                                                                                                                              
                        "s3_key" : "intake/uploads/3edc78aa-2275-45ad-afcb-23bf4a765591/test_file2.csv"          
                }
        ],
        "created_at" : ISODate("2018-08-08T22:06:17.366Z")                                                         
}]

mongo副本中,我可以执行以下操作:

db.uploads.find({"_id": ObjectId("5b6b6959828619572d48a9da"), "files.original_filename": "test_file1.csv"}, {"files.$": 1})

我完全按照自己的意愿接收数据:

{                                                                                                        
        "_id" : ObjectId("5b6b6959828619572d48a9da"),                                                                        
        "files" : [                                                                                                                                                                                                                                                          
                {                                                                                                            
                        "original_filename" : "test_file2.csv",                                                                                                                                                                                                              
                        "s3_key" : "intake/uploads/3edc78aa-2275-45ad-afcb-23bf4a765591/test_file2.csv"                      
                }                                                                                                                                                                                                                                                            
        ]                                                                                                                    
} 

但是在pymongo中,我这样做了:

query = {
    '_id': upload_id,
    'files.original_filename': 'test_file1.csv'
}
projection = {'files.$': 1}
result = list(self.uploads.find(query, projection))

结果是错误的:

[{'files': {}, '_id': ObjectId('5b6b6959828619572d48a9da')}]

为什么?!?

1 个答案:

答案 0 :(得分:0)

        query = {
            '_id': upload_id
        }
        projection = {
            'files': {
                '$elemMatch': {
                    'original_filename': original_filename
                }
            }
        }
        result = list(self.uploads.find(query, projection))

我改用这种投影,似乎可以得到想要的数据。我仍然想知道为什么,以及是否还有其他更好的方法可以做到这一点。