我在 MongoDB 中使用持久化。 selectList查询返回完整的产品列表并将它们加载到内存中;我只想返回列的子集。
Q1)
有没有办法只选择列的子集以便加载更多数据。为了更有效的查询?相当于 mongoDB 投影或 SQL SELECT <col,col...>
也许类似于 selectListCols 函数,它也将属性列表作为参数并返回列表类型的列值而不是实体值。
Q2) 如果没有,我必须求助于手动 Database.MongoDB 查询,我可以从 Persistent 库中使用什么实用程序来修改 selectList 生成的 mongodb 查询,以便我可以向其添加 mongodb 投影并获取 BSON 值?
最佳答案
不,目前还没有办法做到这一点。 persistent 的 github 页面上有一个 Unresolved 问题。总结是作者正在等到 ghc 7.10 来实现一些东西。链接到 open issue和一个 closed duplicate .
您可以使用原始驱动程序来实现您的查询。在库 mongoDB 中,请参阅 Database.MongoDB.Query.Projector。在已关闭的票证中,gregwebs 建议“persistent-mongoDB 中现在有很多助手可以使用原始驱动程序的一些持久类型安全性(fieldName 绝对是您的预测 friend )”
我不知道如何修改 selectList 生成的查询来执行投影。我怀疑当前的 API 是否有办法做到这一点,但我相信您可以使用修补过的持久性来做到这一点。
这是另一种解决方法:您是否考虑过定义不同的 PersistEntity 但保持集合名称相同?例如
let mongoSettings = (mkPersistSettings (ConT ''MongoBackend)) { mpsGeneric = False }
in share [mkPersist mongoSettings, mkMigrate "migrateAll"][persistUpperCase|
Thing sql=thing_collection
name String
stuff [Int32]
deriving Show
SmallThing sql=thing_collection
name String
deriving Show
|]
请注意,sql=thing_collection 用于强制两个 PersistEntity 引用同一个 MongoDB 集合。
此解决方法有一些权衡:
优点:
SmallThing 的查询显然不包含 stuff。这使得进行查询并省略您稍后想要阅读的字段成为编译时错误。缺点:
PersistEntity。如果您的文档包含许多字段并且您正试图从查询中榨取最后一滴性能,那么这可能会有很多变体。Thing“向下转换”为 SmallThing?例如。你手头有一个 Thing,你正在调用一个需要 SmallThing 的函数。你可以使用 fromJSON 和 toJSON,但是 aeson 不支持 ByteString,所以当你有ByteStrings.
另外,检查 toPersistFields 和 fromPersistFields。也许可以使用它们代替 JSON。
关于mongodb - 选择具有 yesod 持久性的列子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25340988/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful