我正在尝试使用 MongoEngine 查询 Mongo 文档中列表的最后一个元素。 我可以编写一个原始查询来执行此操作,但我想知道是否可以在不诉诸于此的情况下完成此操作。
例如,虽然
X.objects(some_list__val='Test Value')
将返回任何具有某些列表元素的对象,例如 val=='Test Value',我希望它只返回列表最后一个元素中 val=='Test Value' 的对象。
您可以使用
$arrayElemAt
或(从 MongoDB 5.0 及更高版本)$last
:
from pymongo import MongoClient
db = MongoClient(port=27019)['mydatabase']
col = db['mycollection']
col.delete_many(({}))
col.insert_many([{'record': [1, 2, 3]},
{'record': [2, 3, 4]},
{'record': [3, 4, 5]}])
item_to_find = 4
agg = col.aggregate([
{'$project': {'record': '$record', 'last': {'$arrayElemAt': ["$record", -1]}}},
{'$match': {'last': item_to_find}}
])
print(list(agg))
agg = col.aggregate([
{'$project': {'record': '$record', 'last': {'$last': "$record"}}},
{'$match': {'last': item_to_find}}
])
print(list(agg))
打印:
[{'_id': ObjectId('6537065c5c20464e8749e8e5'), 'record': [2, 3, 4], 'last': 4}]
[{'_id': ObjectId('6537065c5c20464e8749e8e5'), 'record': [2, 3, 4], 'last': 4}]