我如何在我django工作中在mongoengine中搜索null或none?

lb3vh1jj  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(130)

我的mongodb中有一个字段,我想搜索该字段,无论该字段是否为None,我如何搜索?例如:Robot.objects(data_set_id=None)我用这个来搜索,但得到错误:bson.errors.InvalidId:“None”不是有效的ObjectId,它必须是12字节的输入或24个字符的十六进制字符串

5rgfhyps

5rgfhyps1#

如果要返回data_set_id字段包含空值的所有对象:

Robot.objects.filter(data_set_id__isnull=True)
piok6c0g

piok6c0g2#

不适合我的解决方案:
1.使用__isnull__eq-〉失败

Robot.objects.filter(data_set_id__isnull=True)
Robot.objects.filter(data_set_id__eq=None)
# Cannot resolve subfield or operator isnull on the field data_set_id

2.单独使用Q或与__isnull__eq合并使用-〉失败

from mongoengine.queryset.visitor import Q
Robot.objects.filter(Q(data_set_id=None))
# 'None' is not a valid ObjectId, it must be a 12-byte input or a 24-character hex string

适合我的解决方案:
3.使用__raw__

Robot.objects.(__raw__={"data_set_id":None}))

4.将pymongo版本更新为最新版本

- pymongo==3.12.3
+ pymongo==3.13.0

但是如果您使用的是mongomock,则需要像这样更新数据库连接

mongo_client_class = pymongo.MongoClient

if mongodb_uri.startswith("mongomock://"):
    mongodb_uri = "mongodb://localhost"
    import mongomock
    mongo_client_class = mongomock.MongoClient

connect(host=mongodb_uri, mongo_client_class=mongo_client_class)

但是,在修复之后,您仍然会面临mongomock的另一个问题,即插入重复文档(违反模型类中的唯一约束)不会被捕获和拒绝。

相关问题