gpt4 book ai didi

python - MongoEngine - 通过 id 从 ListField 中提取引用

转载 作者:可可西里 更新时间:2023-11-01 09:13:46 27 4
gpt4 key购买 nike

我想从 ListField(ReferenceField) 中删除一些引用,完全基于它们的值。

我将有关图像的信息存储在以下模型中:

class ImageUrl(Document):
src = UrlField()
counter = IntField()
deleted = BooleanField()

我们将页面上遇到的图像的 id 存储在名为 WebpageEmbeddedDocument 中:

class Webpage(EmbeddedDocument):
image_list = ListField(ReferenceField(ImageUrl))
...

最后,Website 模型被嵌入到 RawData 模型中:

class RawData(Document):
...
webpage = EmbeddedDocumentField(Webpage)

我想从 RawData 记录中删除对 ImageUrl 记录的引用,基于它们的一些属性(例如:计数器值超过 1),然后设置 删除这些ImageUrl记录的属性为True

我在做:

images = ImageUrl.objects((Q(deleted=False) & Q(counter__gt=1)).all()
for image in images:
# all RadData records containing the image in their image list
for rdata in RawData.objects(webpage__image_list__in=[image.id]:
# remove image from the image_list
RawData.objects(id=rdata.id).update_one(pull__webpage__image_list=image.id)
# set 'deleted=True' on the ImageUrl record
ImageUrl.objects(id=image.id).update_one(set__deleted=True)

pull 操作引发以下错误:OperationError:更新失败 [无法将 $pull/$pullAll 修饰符应用于非数组]

据我了解 http://docs.mongodb.org/manual/reference/operator/pull/#_S_pullHow to remove a item from a list(ListField) by id in MongoEngine? ,我需要指定要从中删除值的数组的键。但是,就我而言,我想从列表中删除一个值......我应该怎么做?

非常感谢您的宝贵时间!

最佳答案

位置运算符的工作方式是它允许您查询列表中的值,然后对该值的第一个实例执行操作,通常是更新。 $pull 将从列表中删除所有实例,这就是您想要的。

在带有引用的 mongoengine 中,您可以只传递实例对象,例如:

for rdata in RawData.objects(webpage__image_list=image):
# remove image from the image_list
rdata.update_one(pull__webpage__image_list=image)

我清理了代码,删除了重复的查询 - 因为您已经有了 rdata,所以无需重新查找该文档!

OperationError: Update failed [Cannot apply $pull/$pullAll modifier to non-array] 这意味着您正在尝试拉取需要数组的数据,并且有一个文档,其中 image_list 实际上不是一个数组。这可能是因为在磁盘上有一个文档,其中 image_list 实际上不是一个列表。如果你放一个 try except block ,你可以查看失败的文档,看看是否是这种情况,如果是这样,则需要手动迁移。

关于python - MongoEngine - 通过 id 从 ListField 中提取引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14684687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com