是否可以使用MongoEngine查询数组的最后一个元素?

问题描述 投票:0回答:1

我正在尝试使用 MongoEngine 查询 Mongo 文档中列表的最后一个元素。 我可以编写一个原始查询来执行此操作,但我想知道是否可以在不诉诸于此的情况下完成此操作。

例如,虽然

X.objects(some_list__val='Test Value')
将返回任何具有某些列表元素的对象,例如 val=='Test Value',我希望它只返回列表最后一个元素中 val=='Test Value' 的对象。

python mongodb pymongo
1个回答
0
投票

您可以使用

$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}]

https://www.mongodb.com/docs/v5.0/reference/operator/aggregation/arrayElemAt/#mongodb-expression-exp.-arrayElemAt

https://www.mongodb.com/docs/v5.0/reference/operator/aggregation/last-array-element/#-last--array-operator-

© www.soinside.com 2019 - 2024. All rights reserved.