3

我正在尝试将一个文档 objectID 作为属性(链接)存储到另一个文档中,但 mongo 一直给我这个错误。这行的语法有什么问题?

for u in self.request.db.lyrics.find():
    u['forSong'] = self.request.db.song.find({}, {'_id': 1})
    self.request.db.lyrics.save(u)

在 .Net 4.0 中打开 InfoPath 表单

我正在将较旧的应用程序从 .Net 2 升级到 .Net 4。该程序使用 infopath 表单,它们在工作时引起了相当多的烦恼。首先,它抛出了 FileLoadException,并显示消息“混合模式程序集是针对运行时的版本‘v2.0.50727’构建的,如果没有额外的配置信息,就无法在 4.0 运行时中加载。” 我做了一些研究并将以下内容添加到我的 app.config 文件中:

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

然后我从 Visual Studio 中重新运行该应用程序,当它只是尝试打开一个表单时,它现在抛出一个 COMException,并且“此方法显式使用 CAS 策略,该策略已被 .NET Framework 淘汰。为了出于兼容性原因启用 CAS 策略,请使用 NetFx40_LegacySecurityPolicy 配置开关。” 所以我愿意。我将以下内容添加到我的 app.config 文件中:

<runtime>
    <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

现在,当它尝试打开 InfoPath 表单时,它告诉我需要在我的计算机上安装 .Net 3.5。我想我的问题是,我真的必须将 .Net 3.5 框架安装到计算机上才能运行此应用程序,即使它在 .Net 4.0 中?.Net 3.5 的紧凑版本不起作用,我假设这是从 3.5 到 4.0 的所有 CAS 更改,但我希望有一种编程方式来解决这个问题并打开/保存 InfoPath 表单而不必让用户在他们的计算机上安装另一个框架。

4

1 回答 1

3

问题是find方法的结果是一个游标,而不是一个对象列表

u['forSong'] = self.request.db.song.find({}, {'_id': 1})

是光标,而不是对象。因此,您必须将返回的光标转换为列表才能完成您的任务:

u['forSong'] = list(self.request.db.song.find({}, {'_id': 1}))

这会将{'_id': object-id} 等字典列表保存到“forSong”字段中。要实际接收对象 ID 列表,您必须进行进一步转换,例如:

from operator import itemgetter
...
u['forSong'] = map(itemgetter('_id'),
                   list(self.request.db.song.find({}, {'_id': 1})))
于 2012-08-08T18:39:23.617 回答