【问题标题】:Mongoengine aggregate $match primary key (_id) is not workingMongoengine 聚合 $match 主键 (_id) 不起作用
【发布时间】:2025-12-13 15:40:01
【问题描述】:

我正在尝试将聚合与 mongoengine 一起使用。此外,很难找出它是如何工作的(因为文档中没有关于它的内容),我已经取得了一些进展。

但我无法匹配主键:

from mongoengine import *

connect('test')


class User(Document):
    username = StringField()

    def match_test_username(self):
        pipeline = [{ "$match": {"username": self.username} }]
        return User.objects.aggregate(*pipeline)

    def match_test_id(self):
        pipeline = [{ "$match": {"id": self.id} }]
        return User.objects.aggregate(*pipeline)


mary = User(username="mary")
mary.save()
mary.reload()


agg_username = mary.match_test_username
for doc in agg_username():
    print("match_test_username:", doc)

agg_id = mary.match_test_id
for doc in agg_id():
    print("match_test_id:", doc)

如果你运行这个,匹配对用户名(match_test_username)有效,但我不能让它与主键一起工作,我试过键名:_id,pk,id。

我做错了什么?

是否有关于此的任何文档?我发现的是:Flask-MongoEngine & PyMongo Aggregation Query 非常有帮助。

还有什么帮助,有没有更好的方法(“pythonic 方式”)来迭代发现?

提前谢谢你!

【问题讨论】:

    标签: python-3.x match aggregate mongoengine


    【解决方案1】:

    您应该在查询类型中使用 ID 作为ObjectId。所以你应该这样做:

    pipeline = [{ "$match": {"_id": ObjectId(self.id)} }]
    return User.objects.aggregate(*pipeline)
    

    【讨论】:

    • 感谢您的快速答复!但是:Traceback (most recent call last): File "matchtest.py", line 28, in <module> for doc in agg_id(): File "matchtest.py", line 14, in match_test_id pipeline = [{ "$match": {"_id": ObjectId(self.id)} }] NameError: name 'ObjectId' is not defined
    • 当然你应该导入它。 from bson import ObjectId
    • :-| 它工作了 - 非常感谢! :-) 互联网上有一个 特殊的地方,我可以在这里阅读更多关于关系 mongoengine、BSON 的信息吗?你从哪里知道的?
    • Bson 是 Mongo db 用作数据存储和网络传输格式的数据交换格式。 Bson 是扩展 JSON 的二进制编码格式。几个要检查的链接:bsonspec.orgmongodb.com/json-and-bson
    • 好吧,当我读到 MongoDB 时,我当然也读到过,但我想,mongoengine 会处理这种依赖关系。再次感谢您!