我有一个在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')}]
为什么?!?
答案 0 :(得分:0)
query = {
'_id': upload_id
}
projection = {
'files': {
'$elemMatch': {
'original_filename': original_filename
}
}
}
result = list(self.uploads.find(query, projection))
我改用这种投影,似乎可以得到想要的数据。我仍然想知道为什么,以及是否还有其他更好的方法可以做到这一点。