Dig*_*oug 5 python mongodb mongoengine
简化,我有两个文件,一个包和一个目标.包中包含目标的DBref()列表,目标包含包的DBRef.简化它的设置如下:
class Target(Document):
package = ReferenceField('Package')
name = StringField()
class Package(Document):
targets = ListField(ReferenceField('Target'))
name = StringField()
Run Code Online (Sandbox Code Playgroud)
当我创建一组目标时,使用mongoengine的标准方法按预期工作:
# in a method on Package, self = current Package instance
target = Target(name="My Name", package=self).save()
self.targets.insert(0, targets)
Run Code Online (Sandbox Code Playgroud)
我可以通过该包查询目标,并按预期返回结果:
>>> p = Package.objects.get(id='53e4db7bc57d207fc3d70738')
>>> Target.objects(name="My Name", package=p)
[<Target: My Name>]
Run Code Online (Sandbox Code Playgroud)
但对于某些目标,我们一次创建很多,而是使用批量执行来创建文档(简化):
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()
Run Code Online (Sandbox Code Playgroud)
这些对象看起来完全正常,但是,即使读取它们的值似乎没有问题,引用它们的包的查询也不起作用.
(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>
Run Code Online (Sandbox Code Playgroud)
即使做一个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"}'
Run Code Online (Sandbox Code Playgroud)
似乎相当清楚的是,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>]
Run Code Online (Sandbox Code Playgroud)
这似乎更多地表明,拯救目标的本质确实是问题所在.
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |