Mongoengine:查询引用字段不返回任何结果,但字段在对象上有效

时间:2014-08-08 15:01:18

标签: python mongodb mongoengine

简化,我有两个文件,一个包和一个目标。包中包含目标的DBref()列表,目标包含包的DBRef。简化它的设置如下:

class Target(Document):

    package = ReferenceField('Package')
    name = StringField()


class Package(Document):

    targets = ListField(ReferenceField('Target'))
    name = StringField()

当我创建一组目标时,使用mongoengine的标准方法按预期工作:

# in a method on Package, self = current Package instance
target = Target(name="My Name", package=self).save()
self.targets.insert(0, targets)

我可以通过该包查询目标,并按预期返回结果:

>>> p = Package.objects.get(id='53e4db7bc57d207fc3d70738')
>>> Target.objects(name="My Name", package=p)
[<Target: My Name>]

但对于某些目标,我们一次创建很多,而是使用批量执行来创建文档(简化):

bulk = Target._get_collection().initialize_unordered_bulk_op()
for line in csv_reader:
    entry = dict(zip(header, line))
    entry.update({'name': 'My Name', '_cls': 'Target', 'package': package.to_dbref()})

    bulk.find({'name': 'My Name', 'package': package.to_dbref()}).upsert().update({'$set': entry})

bulk.execute()

这些对象看起来完全正常,但是,即使读取它们的值似乎没有问题,引用它们的包的查询也不起作用。

(Pdb) self
 <Package: Video Package 53e3edc7c57d2079436a14c9>
(Pdb) Target.objects(name="My Name", package=self)
[]
(Pdb) Target.objects(name="My Name")
[<Target: My Name>]
(Pdb) Target.objects(name="My Name")[0].package
<Package: Video Package 53e3edc7c57d2079436a14c9>

即使做to_json这些对象看起来似乎具有可比性:

>>> bad_target.to_json()
'{"_id": {"$oid": "53e4334cd2f370649dce5e20"}, "_cls": "Target", "package": {"$oid": "53e4334cc57d207f0a86a3c7"}, "name": "Bad Target"}'

>>> good_target.to_json()
'{"_id": {"$oid": "53e4db7bc57d207fc3d70739"}, "_cls": "Target", "package": {"$oid": "53e4db7bc57d207fc3d70738"}, "name": "Good Target"}'

似乎相当清楚bulk操作可能是这里的罪魁祸首,但据我所知,它正确完成并且正常操作(如检索引用Package对象)按预期工作,但查询将只是不归还任何东西。任何想法或建议将非常感谢!


使用新信息进行更新

使用原始pymongo查询会产生一些更有趣的结果:

>>> Target.objects(__raw__={"name": "My Name", "package": p.to_dbref()})
[]
>>> Target.objects(__raw__={"name": "My Name", "package": p.id})
[<KeywordTarget: My Name>]

这似乎更能说明拯救目标的本质确实是问题所在。

0 个答案:

没有答案